五、处理分类型特征:编码与哑变量
主要方法:
preprocessing.LabelEncoder
标签专用法,将分类转换为分类数值preprocessing.OrdinalEncoder
特征专用法,将分类特征转换为分类数值preprocessing.OneHotEncoder
独热编码,创建哑变量
什么是哑变量呢?
哑变量(DummyVariable),也叫虚拟变量, 引入哑变量的目的是,将不能够定量处理的变量量化。
例如:在线性回归分析中引入哑变量的目的是,可以考察定性因素对因变量的影响,它是人为虚设的变量,通常取值为0或1,来反映某个变量的不同属性。对于有n个分类属性的自变量,通常需要选取1个分类作为参照,因此可以产生n-1个哑变量。如职业、性别对收入的影响,战争、自然灾害对GDP的影响,季节对某些产品(如冷饮)销售的影响等等。
这种“量化”通常是通过引入“哑变量”来完成的。根据这些因素的属性类型,构造只取“0”或“1”的人工变量,通常称为哑变量(dummyvariables),记为D。
举一个例子,假设变量“职业”的取值分别为:工人、农民、学生、企业职员、其他,5种选项,我们可以增加4个哑变量来代替“职业”这个变量,分别为D1(1=工人/0=非工人)、D2(1=农民/0=非农民)、D3(1=学生/0=非学生)、D4(1=企业职员/0=非企业职员),最后一个选项“其他”的信息已经包含在这4个变量中了,所以不需要再增加一个D5(1=其他/0=非其他)了。这个过程就是引入哑变量的过程。
此时,我们通常会将原始的多分类变量转化为哑变量,每个哑变量只代表某两个级别或若干个级别间的差异,通过构建回归模型,每一个哑变量都能得出一个估计的回归系数,从而使得回归的结果更易于解释,更具有实际意义。
(1)preprocessing.LabelEncoder 将标签转换为数值
使用LabelEncoder对目标标签进行编码,值在0到n_class -1之间。
from sklearn.preprocessing import LabelEncoder y=data.iloc[:,-1] y.shape
from sklearn.preprocessing import LabelEncoder le=LabelEncoder() le=le.fit(y) label=le.transform(y) le.classes_ # 标签中有多少类别 label
le.fit_transform(y) le.inverse_transform(label) # 0代表死亡,1代表存活
data.loc[:,-1]=label data.drop(['Survived'],axis=1,inplace=True) data.rename(columns={-1:'Survived'},inplace=True) data.head()
(2)preprocessing.OrdinalEncoder 将特征转换为数值
preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
from sklearn.preprocessing import OrdinalEncoder data_=data.copy() data_
# 取出需要转换的两个字段 OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_ data_.iloc[:,1:-1]
使用OrdinalEncoder将字符型变成数值 data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
(3)preprocessing.OneHotEncoder 将特征转为稀疏矩阵
使用OrdinalEncoder的处理结果会让各值之间有一定的联系,比如1-2=-1,0=1-1,会对建模产生一定的影响。此时则使用OneHotEncoder。
OneHotEncoder 独热编码作用:分类编码变量,将每一个类可能取值的特征变换为二进制特征向量,每一类的特征向量只有一个地方是1,其余位置都是0
from sklearn.preprocessing import OneHotEncoder X=data.iloc[:,1:-1] X
enc=OneHotEncoder(categories="auto").fit(X) enc.transform(X)
result=enc.transform(X).toarray() result
也可以将使用OneHotEncoder后的数据进行还原:
# 将使用OneHotEncoder后的数据进行还原 pd.DataFrame(enc.inverse_transform(result))
enc.get_feature_names() newdata=pd.concat([data,pd.DataFrame(result)],axis=1) newdata.drop(['Sex','Embarked'],axis=1,inplace=True) newdata.columns=['Age','Survived','Female','Male','Embarked_C','Embarked_Q','Embarked_S'] newdata
整理后的数据:
如果有缺失值的话使用众数进行填充:
imp_=SimpleImputer(strategy='most_frequent') imp_mf=imp_.fit_transform(newdata.iloc[:,1:]) newdata.iloc[:,1:]=imp_mf
六、处理连续性特征:二值化与分段
(1)preprocessing.LabelBinarizer 标签二值化
标签可以使用sklearn.preprocessing.LabelBinarizer进行哑变量处理。
二值化:指将大于0的特征使用1表示,将等于0的特征还是用0表示。例如Binarizer(threshold=0.9) :将数据进行二值化,threshold表示大于0.9的数据为1,小于0.9的数据为0
对于二值化操作:
- 方法一: 求出大于等于1的索引值,令这些索引值对应的数值等于1,然后重新构建列
- 方法二:使用
Binarizer(threshold=0.9)
表示大于0.9的数据使用1表示
这里传入的参数需要是二维的,因此需要做维度转换
data_2=data.copy() from sklearn.preprocessing import Binarizer x=data_2.iloc[:,0].values.reshape(-1,1) transformer=Binarizer(threshold=30).fit_transform(x) transformer
# 将二值化返回newdata newdata2=pd.concat([newdata,pd.DataFrame(transformer)],axis=1) # 将二值化后的数据Age_code合并到原本数据当中 newdata2.columns=['Age','Survived','Female','Male','Embarked_C','Embarked_Q','Embarked_S','Age_code'] newdata2.drop(['Age'],axis=1,inplace=True) # 删除原本的Age
# 使用众数填充缺失值 imp_=SimpleImputer(strategy='most_frequent') imp_mf=imp_.fit_transform(newdata2.iloc[:,-1:]) newdata2.iloc[:,-1:]=imp_mf
(2)preprocessing.KBinsDiscretizer 连续属性离散化
KBinsDiscretizer
类:这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。
使用k个等宽的bins把特征离散化,默认情况下,输出是被 one-hot 编码到一个稀疏矩阵。(请看类别特征编码)。 而且可以使用参数encode进行配置。对每一个特征, bin的边界以及总数目在 fit过程中被计算出来,它们将用来定义区间。
from sklearn.preprocessing import KBinsDiscretizer x=data.iloc[:,0].values.reshape(-1,1) est=KBinsDiscretizer(n_bins=3,encode='ordinal',strategy='uniform') est.fit_transform(x)
set(est.fit_transform(x).ravel()) est=KBinsDiscretizer(n_bins=3,encode='onehot',strategy='uniform') est.fit_transform(x).toarray()
newdata3=pd.concat([newdata,pd.DataFrame(est.fit_transform(x).toarray())],axis=1) # 将年龄进行分段 newdata3.columns=['Age','Survived','Female','Male','Embarked_C','Embarked_Q','Embarked_S','Age_1','Age_2','Age_3']
此时得到的整理后的数据就都是浮点型了。