我是Python for Machine Learning中的数据预处理新手。我正在尝试预处理一些数据。数据由许多分类变量组成,其中包含一些空和NaN条目。我正在使用ffil方法填充空或NaN空间,然后使用sklearn LabelEncoder和后来的单热编码进行标签编码。我有两个不同的代码段。第一个是更简单的做标签编码没有错误,但在第二种情况下几乎没有附加进程我得到上述错误:第一个代码部分:
encoder = LabelEncoder()
for cols in train.keys():
if(cols.startswith('cat')):
train[cols].fillna(method='ffill', inplace=True)
train[cols].fillna(method='bfill', inplace=True)
if train[cols].dtype == 'object':
train[cols] = encoder.fit_transform(train[cols])
train = pd.get_dummies(data=train, columns=[cols])
第二个代码部分:
encoder = LabelEncoder()
best_fit = SelectKBest(score_func=chi2, k=10)
for cols in train.keys():
if(cols.startswith('cat')):
train[cols].fillna(method='ffill', inplace=True)
train[cols].fillna(method='bfill', inplace=True)
if train[cols].dtype == 'object':
train[cols] = encoder.fit_transform(train[cols])
train_temp = pd.get_dummies(data=train, columns=[cols])
temp_df = train_temp[list(set(train_temp.keys())-set(train.keys()))]
fit_temp = best_fit.fit(temp_df, target)
features_temp = fit_temp.transform(temp_df)
train = train.drop([cols], axis=1)
train = pd.concat([train, pd.DataFrame(features_temp)], axis = 1, join='outer')
Traceback日志:
Traceback (most recent call last):
File "<ipython-input-1-4efe4593ba69>", line 37, in <module>
train[cols] = encoder.fit_transform(train[cols])
File "C:\Continuum\anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 112, in fit_transform
self.classes_, y = np.unique(y, return_inverse=True)
File "C:\Continuum\anaconda3\lib\site-packages\numpy\lib\arraysetops.py", line 211, in unique
perm = ar.argsort(kind='mergesort' if return_index else 'quicksort')
TypeError: '>' not supported between instances of 'str' and 'float'
已解决的问题:看起来像是一些内部错误。重新启动计算机并再次执行脚本解决了这个问题。
发生此错误的原因是,数据在传递给编码器时必须具有统一的数据类型,即在将列传递给编码器时将列转换为一个dtype。
from sklearn import preprocessing
encoder = preprocessing.LabelEncoder()
df = pd.DataFrame({'a':[1,2,3,'NAN','4']})
encoder.fit_transform(df['a'].astype(str))
#or if you have only numerical datatype then
#encoder.fit_transform(pd.to_numeric(df['a'],errors='coerce'))