将熊猫字符串数据转换为决策树的数字



我正在尝试将几列字符串数据转换为数字以馈送到分类模型中。具有一个修改列的示例数据集为:

输入:

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

最新更新