- preprocessing.OneHotEncoder
之前在舱门Embarked这一列中,我们使用[0,1,2]代表了三个不同的舱门,然而这种转换是正确的吗?
体重(>45kg,>90kg,>135kg) 各个取值之间有联系,且是可以互相计算的,比如120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这是有距变量。
对特征进行编码时,三类数据被我们转化成[0,1,2],而这在算法看来是都是体重那种分类的方法,也就是连续可计算的。
而像舱门这里S Q C和性别男女这样的只是一个名义变量而没有可计算的性质,而是有你没我的性质,这种情况下我们要使用哑变量来处理。
简言之以舱门为例,
就是把S Q C 对应0 1 2这样一个一位数组而改成放在一个二维数组中,S Q C 分别对应一个特征的1
就像
S [ [1 0 0],
Q [0 1 0],
C [0 0 1] ]
以此图数据集为例
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
X.head(2)
enc = OneHotEncoder(categories='auto').fit(X)#请sklearn自己看看有多少类
result = enc.transform(X).toarray()#请把这个结果转换成数组
result
#性别 男 女
#舱门 S Q C\
#一共五类变量
enc.transform(X)#这是一个稀疏矩阵对象是由0和1组成的矩阵
<889x5 sparse matrix of type ‘<class ‘numpy.float64’>’
with 1778 stored elements in Compressed Sparse Row format>
#依然可以直接一步到位
OneHotEncoder(categories='auto').fit_transform(X).toarray()
#依然可以还原
pd.DataFrame(enc.inverse_transform(result))
enc.get_feature_names()
#如果特征特多可以调用这个查看
再把处理好的数据放回去移除之前没有热值化的Age和Embarked
#axis=1,表示跨行进行合并,也就是将量表左右相连,
#如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
newdata.head()
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
newdata.head()