Руководство по работе с отсутствующими данными с помощью библиотек Scikit-Learn и Pandas.
Фреймворки машинного обучения не работают с отсутствующими данными. Перед построением модели машинного обучения необходимо решить, как обрабатывать отсутствующие данные. Вы можете использовать различные методы для отсутствующих данных. Например, вы можете удалить все строки с отсутствующими данными. Но этот метод приводит к потере информации. Заполнение недостающих данных статистическими значениями лучше для производительности модели. Среднее значение столбца или медиана столбца часто используется для отсутствующих данных.
В этом посте я расскажу о том, как обрабатывать отсутствующие данные с помощью библиотек Scikit-Learn и Pandas. Я затрону следующие темы,
- Как использовать метод дропна?
- Вменение пропущенных значений
- Отсутствующие данные с Pandas
Чтобы показать, как обрабатывать отсутствующие данные, позвольте мне импортировать библиотеки NumPy и Pandas.
import pandas as pd import numpy as np
Отсутствующие данные в наборе данных могут быть представлены как пустые, NaN (не число) или NULL. Теперь я собираюсь создать набор данных с отсутствующими данными.
data = np.array([[1, 2, 3, 4], [5, 6, 7, np.nan], [9, 10, np.nan, 11]])
Теперь давайте преобразуем эти данные в структуру фрейма данных Pandas. Позвольте мне также назвать столбцы.
df = pd.DataFrame(data,columns=["A","B","C","D"])
Давайте посмотрим на этот набор данных.
df #Output: A B C D 0 1.0 2.0 3.0 4.0 1 5.0 6.0 7.0 NaN 2 9.0 10.0 NaN 11.0
Здесь nan относится к отсутствующим данным. Чтобы увидеть отсутствующие данные, вы можете использовать метод isnull.
df.isnull() #Output: A B C D 0 False False False False 1 False False False True 2 False False True False
Этот метод возвращает true и false. True указывает на отсутствие данных. Давайте используем метод суммы, чтобы увидеть сумму недостающих данных.
df.isnull().sum() #Output: A 0 B 0 C 1 D 1 dtype: int64
Как видите, в столбцах C и D не хватает одного.
1. Метод дропна
Давайте рассмотрим методы обработки отсутствующих данных. Во-первых, мы можем удалить недостающие данные из набора данных. Давайте воспользуемся для этого методом дропна. Параметр axis=0 означает удаление строк с отсутствующими данными.
df.dropna(axis=0) #Output: A B C D 0 1.0 2.0 3.0 4.0
Как видите, вторая и третья строки с отсутствующими данными были удалены из набора данных. Ось = 1 означает удаление столбцов с отсутствующими данными.
df.dropna(axis=1) #Output: A B 0 1.0 2.0 1 5.0 6.0 2 9.0 10.0
Как видите, столбцы C и D с отсутствующими данными были удалены из набора данных. Метод дропна имеет еще несколько параметров. Например, параметр how="all" означает удаление строк с отсутствующими данными во всех их значениях.
df.dropna(how= 'all') #Output: A B C D 0 1.0 2.0 3.0 4.0 1 5.0 6.0 7.0 NaN 2 9.0 10.0 NaN 11.0
Например, если вы хотите удалить строки со значениями меньше 4, вы можете использовать параметр tresh.
df.dropna(thresh=4) #Output: A B C D 0 1.0 2.0 3.0 4.0
Если вы хотите удалить недостающие данные в определенном столбце, вы можете использовать параметр подмножества. Например, предположим, что мы хотим удалить недостающие данные в столбце D.
df.dropna(subset = ["D"]) #Output: A B C D 0 1.0 2.0 3.0 4.0 2 9.0 10.0 NaN 11.0
Удаление всех строк или столбцов с отсутствующими данными имеет некоторые недостатки. Например, удаление недостающих данных может привести к потере информации. Чтобы не потерять информацию в наборе данных, вы можете заполнить недостающие данные статистическими значениями.
2. Вменение пропущенных значений
Наиболее общий метод заключается в использовании среднего значения столбца. Для этого я буду использовать класс SimpleImputer в Scikit-Learn. Позвольте мне импортировать этот класс.
from sklearn.impute import SimpleImputer
Теперь я собираюсь создать экземпляр из этого класса. Поскольку отсутствующие данные обозначаются nan, напишем в параметре стратегииmissing_values=np.nan и mean.
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
Наш набор данных готов. Наш набор данных представляет собой фрейм данных. Давайте преобразуем набор данных в массив Numpy, используя метод подгонки. Помните, Scikit-Learn любит работать с массивами NumPy.
imp_mean = imp_mean.fit(df.values)
Теперь давайте применим этот импутатор к нашему набору данных с помощью метода преобразования.
imputed_data = imp_mean.transform(df.values)
Теперь давайте посмотрим на набор данных.
imputed_data #Output: array([[ 1. , 2. , 3. , 4. ], [ 5. , 6. , 7. , 7.5], [ 9. , 10. , 5. , 11. ]])
Обратите внимание, что сначала мы создали импутер на основе набора данных. Таким образом, параметры были изучены. Затем мы преобразовали набор данных в соответствии с этими изученными параметрами.
Давайте еще раз пройдемся по кодам для лучшего понимания. Во-первых, мы взяли пример под названием imp_mean. Затем мы создали импутер в соответствии с набором данных и, наконец, применили этот импьютер к набору данных. Например, если бы у вас был набор тестовых данных, вы бы применили этот импутер, который изучает параметры.
3. Отсутствующие данные с Pandas
Вы также можете использовать метод fillna в Pandas, чтобы заполнить недостающие данные. В этом методе вы указываете, как вы хотите заполнить недостающие данные. Например, давайте использовать среднее значение столбца.
df.fillna(df.mean()) #Output: A B C D 0 1.0 2.0 3.0 4.0 1 5.0 6.0 7.0 7.5 2 9.0 10.0 5.0 11.0
При желании вы можете заполнить недостающие данные медианой или максимальным значением столбца.
Заключение
В этом посте я показал, как обрабатывать отсутствующие данные с помощью библиотек Scikit-Learn и Pandas. Спасибо за чтение. Я надеюсь, вам понравится это.
Не забудьте подписаться на нас на YouTube | Гитхаб | Твиттер| Kaggle | ЛинкедИн👍
Ресурсы
- Рашка С., Лю Ю., Миржалили В. и Джулгаков Д. (2022). Машинное обучение с помощью PyTorch и Scikit-Learn. Разрабатывайте модели машинного обучения и глубокого обучения с помощью Python. Издательство Пакет.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.
Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏, чтобы показать мне свою поддержку 👇