Python - использование SkLearn Imputer

У меня есть следующий вопрос: у меня есть фреймворк pandas, в котором отсутствующие значения отмечены строкой na. Я хочу запустить на нем Imputer, чтобы заменить отсутствующие значения средним значением в столбце. Согласно документации sklearn, в этом мне должен помочь параметр missing_values:

пропущенные_значения: целое число или «NaN», необязательно (по умолчанию = «NaN»). Заполнитель для пропущенных значений. Будут условно исчислены все вхождения отсутствующих_значений. Для пропущенных значений, закодированных как np.nan, используйте строковое значение «NaN».

В моем понимании это означает, что если я напишу

df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)

это означало бы, что импутер заменяет что-либо в фрейме данных значением na со средним значением столбца. Однако вместо этого я получаю сообщение об ошибке:

ValueError: could not convert string to float: na

Что я неправильно понимаю? Разве не так должен работать приёмник? Как тогда я могу заменить строки na средним значением? Должен ли я просто использовать для этого лямбду?

Спасибо!


person lte__    schedule 01.07.2016    source источник


Ответы (4)


Поскольку вы говорите, что хотите заменить эти 'na' средним значением столбца, я предполагаю, что не пропущенные значения действительно являются плавающими. Проблема в том, что pandas не распознает строку 'na' как отсутствующее значение и поэтому читает столбец с dtype object вместо некоторого вида float.

В качестве примера рассмотрим следующий .csv файл:

 test.csv

 col1,col2
 1.0,1.0
 2.0,2.0
 3.0,3.0
 na,4.0
 5.0,5.0

При наивном импорте df = pd.read_csv('test.csv'), df.dtypes сообщает нам, что col1 имеет dtype object, а col2 - dtype float64. Но как понять кучу предметов?

Решение состоит в том, чтобы указать pd.read_csv() интерпретировать строку 'na' как отсутствующее значение:

df = pd.read_csv('test.csv', na_values='na')

Результирующий фрейм данных содержит оба столбца dtype float64, и теперь вы можете использовать свой импьютер.

person Alberto Garcia-Raboso    schedule 01.07.2016

Вот ошибка, которую я получал

IndexError: в будущем логические массивы 0-d будут интерпретироваться как допустимый логический индекс

В моем случае у меня была проблема с "средней" стратегией, я изменил ее на "mean" или "most_frequent".

person vikas    schedule 10.02.2017

сначала импортируйте pandas , затем прочтите your_file_name.csv . И iloc определен как pandas.DataFrame.iloc и представляет собой целочисленное индексирование для местоположения по положению. Здесь формат iloc[for row index , for column index], где a, b, c, d - целые числа, ab, c, d также могут быть пустыми.

import pandas as pd
dataSet = pd.read_csv('your_file_name.csv')
X = dataSet.iloc[ a:b , c:d].values

если вы используете без .values, то вы не сможете использовать его в импутере для преобразования
здесь после импорта Imputer определите свои Imputer параметры missing_values =
"отсутствующие значения в данных, которые вы хотите заменить", strategy ="mean" ( Есть еще две стратегии, которым он следует, то есть медиана и наиболее часто встречающаяся в вашем наборе данных, но по умолчанию это среднее значение. Затем установите axis = (0 для столбца и 1 для строки), другие - копирование и подробный), вы можете узнать больше об этом на

from sklearn.preprocessing import Imputer
i = Imputer(missing_values="NaN", strategy="mean", axis=0) 

поместите данные в ваш определенный способ Imputer, а затем преобразуйте их с помощью метода преобразования. это вернет массив типа данных = объект

i  = i.fit(X[a:b, c:d])
X[a:b, c:d ] = i.transform(X[a:b,c:d])

Помните, что здесь выбранные вами столбцы содержат только значения типа с плавающей запятой или целочисленного типа, иначе это может показать ошибку, не удается преобразовать строку в плавающую.

person stacked    schedule 26.06.2018

Здесь нужно обратить внимание на несколько вещей.

Убедитесь, что вы не вменяете тип «объект» или категориальные переменные, вы можете просмотреть свои данные следующим образом:

df = pd.read_csv(filename)

print(df.info(null_counts=True))

Последний столбец должен быть типа

Посмотрим на пример:

df = pd.DataFrame({'A' : [1, 2, 2, 2, 'NaN', 3, 4, 5, 6], 'B' : [3, 3, 'NaN', 3, 3, 4, 3, 3, 3]})

выход:

df.head()


    A   B
---------
0   1   3
1   2   3
2   2   NaN
3   2   3
4   NaN 3

Теперь посмотрим на типы

df.info(null_counts=True)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 2 columns):
0    9 non-null float64
1    9 non-null float64
dtypes: float64(2)
memory usage: 224.0 bytes

Теперь вменяем:

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
df_imputed = pd.DataFrame(imputer.fit_transform(df))
df_imputed.head()


    0   1
-----------
0   1.0 3.0
1   2.0 3.0
2   2.0 3.0
3   2.0 3.0
4   2.0 3.0

Теперь это все хорошо, но нельзя сделать категориально (тип Object / String)

Один из способов справиться с этим - изменить категориальные функции на числовые, примерно так:

df_with_cat = pd.DataFrame({'A': ['ios', 'android', 'web', 'NaN'], 'B' : [4, 4, 'NaN', 2]})
df_with_cat.head()


      A     B
-------------
0   ios     4
1   android 4
2   web     NaN
3   NaN     2

И информация

df_with_cat.info(null_counts=True)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
A    4 non-null object
B    4 non-null object
dtypes: object(2)
memory usage: 144.0+ bytes

Мы точно знаем, что B является числовым, поэтому давайте сделаем это:

df_with_cat['B'] = df_with_cat['B'].astype(np.float)
df_with_cat.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
A    4 non-null object
B    3 non-null float64
dtypes: float64(1), object(1)
memory usage: 144.0+ bytes

Если бы мы использовали тот же самый импьютер, что и выше, мы бы получили ошибку (вы можете попробовать)

Теперь давайте преобразуем категории «А» в числа:

CATEGORICAL_FEATURES = [
    'A', 
]
data_dum = pd.get_dummies(df_with_cat, columns=['A'], drop_first=True)
data_dum.head()

    B   A_android   A_ios   A_web
---------------------------------
0   4       0         1       0
1   4       1         0       0
2   NaN     0         0       1
3   2       0         0       0

Теперь мы можем запустить тот же Imputer сверху на нашем фрейме данных.

person Kohn1001    schedule 05.02.2019