我正在尝试将几列字符串数据转换为数字以馈送到分类模型中。具有一个修改列的示例数据集为:
输入:
data = [['tom', 10], ['nick', 15], ['juli', 14], ['nick', '12']]
data = pd.DataFrame(data, columns = ['Name', 'Age'])
data
输出:
Name Age
0 tom 10
1 nick 15
2 juli 14
3 nick 12
我意识到scikit learn不能很好地处理字符串数据,但是现在我真的更愿意继续使用它,如果可能的话(公司限制(。但是,我的问题是,如果我使用
sklearn.preprocessing.LabelEncoder
我能够使用".classes_"来获取一些数值,例如:
输入:
le = preprocessing.LabelEncoder()
le.fit(data['Name'])
le.classes_
vals = le.transform(le.classes_)
vals
我得到
输出:
array([0, 1, 2])
由于此数组仅包含三个值,因此我无法使用
data['Name'] = vals
因为我的列长度是 4,我的 vals 长度是 3。
考虑到这一点,我有没有另一种方法可以在scikit-learn中做到这一点,或者我唯一的选择是使用不同的库?
试试这个:
le = preprocessing.LabelEncoder()
data['Name']= le.fit_transform(data['Name'])
这会为整个列分配标签。
你也可以这样做:
pd.get_dummies(data=data, columns=['Name'])
输出:
Age Name_juli Name_nick Name_tom
0 10 0 0 1
1 15 0 1 0
2 14 1 0 0
3 12 0 1 0
现在,您的数据已准备好进行模型训练。通常OneHot编码比LabelEncode更好,因为LabelEncode意味着你的名字之间存在数字关系。如果 Juli==0、Nick==1 和 Tom==2,你就暗示July < Nick < Tom
这可能会在某些模型中造成麻烦。
le = preprocessing.LabelEncoder()
le.fit(data['Name'])
le.classes_
vals = le.transform(data['Name'])
vals
当你使用fit(data['Name'])
时,你实际上可以使用fit(data['Name'].unique())
,因为只有唯一值用于拟合,但对于transform
你必须使用所有数据。
from sklearn.preprocessing import Imputer
imputer =Imputer(missing_values="NaN", strategy='mean', axis=0)
imputer=imputer.fit(X[:,1:3])
X[:,1:3]= imputer.transform(X[:,1:3])
#Concept of Dummy Variable, Handling the conflict of them
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
#We have to give the column number necessary to change it in numeric form
X[:,0]=labelencoder_X.fit_transform(X[:,0])
onehotencoder=OneHotEncoder(categorical_features =[0])
X=onehotencoder.fit_transform(X).toarray()
# prepare input features
def LABEL_Encoding(X):
objList = data.select_dtypes(include = "object").columns
print (objList)
le = LabelEncoder()
for feat in objList:
data[feat] = le.fit_transform(data[feat].astype(str))
return data