【机器学习】Sklearn特征工程构建与优化

来源:互联网 发布:linux系统zip命令 编辑:程序博客网 时间:2024/06/08 00:42

1、观察数据集

主要观察数据集的信息和质量,方便之后处理

import pandas as pdfrom pandas import DataFrame,Seriesdata_train = pd.read_csv('train_tatanic.csv')#数据集整体信息data_train.info()#Survived是本例标签。#显示数据的缺失程度print(data_train.groupby('Survived').count())

根据打印出来的结果,可以观察样本比例略不均衡,但是差别不大。同时注意到有缺失值,在训练之前需要进行处理。

2、数据预处理

观察特征,进行挑选

data_train.head(4)

剔除无效的信息及其相关的数据集

3、处理缺失值数据

补全缺失值的目的就是为了尽量保持原始的信息状态。处理手段主要有如下几种:
a>扔掉缺失值
b>按照某个统计量补全,统计量可以是定值、均值、中位数
c>拿模型预测缺失值

#定义缺失值补充函数,以均值为例def set_missing_age(df):    df.loc[(df.Age.isnull()),'Age'] = int(df.Age.dropna().mean())    return dfdf_ = set_missing_age(data_train)print(df_)

4、归一化数据集

#归一化数据import sklearn.preprocessing as preprocessingscaler = preprocessing.StandardScaler()#去掉非数字化的信息,方便对整体进行归一化del df_['Name']del df_['Sex']del df_['Ticket']del df_['Cabin']del df_['Embarked']#print(df_)#可以直接对df_进行归一化,得到多维数组矩阵df_ = scaler.fit_transform(df_)#也可以对特定的数据进行标准化,此处不需要删除其他不能归一化的数列,添加到原df_里面#df_['Age_scaler'] = scaler.fit_transform(df_['Age'].reshape(-1, 1))#df_['Fare_scaler'] = scaler.fit_transform(df_['Fare'])print(df_)

5、处理类别意义的特征

数据集中的Cabin的缺失过于严重,可以将‘有无’这一新信息进行处理。

def set_cabin_type(df):    df.loc[(df_.Cabin.notnull()),'Cabin'] = 'Yes'    df.loc[(df_.Cabin.isnull()),'Cabin'] = 'No'    return dfdf__ = set_cabin_type(df_)print(df__)

进行one_hot编码,采用pd.get_dummies()方式

#处理Pclass特征dummies_pclass = pd.get_dummies(data_train['Pclass'],prefix = 'Pclass')#print(dummies_pclass.head(3))#处理Embarked特征dummies_embarked = pd.get_dummies(data_train['Embarked'],prefix = 'Embarked')#print(dummies_embarked.loc[61])#预处理其他类别数据,把Sex的文本数据换成数字。dummies_sex = pd.get_dummies(data_train['Sex'],prefix = 'Sex')print(dummies_sex.head(3))

6、整合数据

接下来可以将处理好的数据维度合并进去,把不需要的维度扔掉:

#整个dfff = pd.concat([df__,dummies_pclass,dummies_embarked,dummies_sex],axis =1) #print(dfff)#丢弃多余的dfff.drop(['Pclass','Name','Sex','Ticket','Cabin','Embarked'],axis = 1,inplace = True)print(dfff)

7、将处理好的数据进行建模

#导入训练模型import sklearnfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_scoredfff = dfff.as_matrix()print(dfff[:,0])X_train = dfff[:,2:]y_train = dfff[:,1]'''#通过iloc的方式或者先生成矩阵dfff.as_matrix()X_train = dfff.iloc[:,2:]X_train = X_train.valuesprint(X_train)y_train = dfff.iloc[:,1]y_train = y_train.values'''#print(y_train)#print(X_train.shape,y_train.shape)model = sklearn.svm.SVC()model.fit(X_train,y_train)print(model.predict(X_train))print('模型训练的准确率:{}'.format(accuracy_score(y_train,model.predict(X_train))))

8、进一步构建非线性的特征

通过人工构建非线性的特征,弥补线性模型对非线性表达式的解释能力不足的问题。特征的非线性的表达式可以分为两类:一类是用于表达数值特征本身的非线性因素;另外一类是用于表达特征与特征之间存在的非线性关联,并且这种关联对结果有帮助。

对于第一种,仅适用于数值特征,对应的构建特征的方式有两种:多项式和离散化。多项式是指构建原有数值的高次方作为特征;离散化指将连续的数值划分一个个区间。高次方让数值内的表达式变得更为复杂,可描述能力强;而离散化则是让模型来拟合逼近真实的关系描述。

以Age为例,构建平方特征,也可以拿是否满足Age< 10这一条件划分新的特征#dfff['Age']<10生成bool值,.astype(int)转化为数值型dfff['child'] = (dfff['Age']<10).astype(int)#print((dfff['Age']<10))#print(dfff['child'])dfff['Age*Age'] = dfff['Age']*dfff['Age']#归一化dfff['Age*scale'] = scaler.fit_transform(dfff['Age*Age'].reshape(-1, 1))dfff.drop(['Age*Age'],axis = 1,inplace = True)#or#dfff = dfff.drop(['Age*Age'],axis = 1)#print(dfff)

9、评估新的特征的作用

最常用的方式就是看模型的成绩是否提升,同时观察模型给特征分配的权重,看特征发挥的作用,上述用SVM方法的时候,用默认rbf核的效果比线性linear核的效果好,但是不能得到权重系数。

#导入训练模型import sklearnfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score#dfff = dfff.as_matrix()#print(dfff[:,0])#dfff['Age']<10生成bool值,.astype(int)转化为数值型dfff['child'] = (dfff['Age']<10).astype(int)#print((dfff['Age']<10))#print(dfff['child'])dfff['Age*Age'] = dfff['Age']*dfff['Age']#归一化dfff['Age*scale'] = scaler.fit_transform(dfff['Age*Age'].reshape(-1, 1))dfff.drop(['Age*Age'],axis = 1,inplace = True)#or#dfff = dfff.drop(['Age*Age'],axis = 1)#print(dfff)X_train = dfff.iloc[:,2:]X_train = X_train.values#print(X_train)y_train = dfff.iloc[:,1]y_train = y_train.values#print(y_train)#print(X_train.shape,y_train.shape)model = sklearn.svm.SVC(kernel = 'linear')model.fit(X_train,y_train)print(dfff.columns[2:])print(pd.DataFrame(model.coef_[0],index = list(dfff.columns)[2:]))#print(model.predict(X_train))print('模型训练的准确率:{}'.format(accuracy_score(y_train,model.predict(X_train))))

总结:
针对数据特征,从两个维度进行构建,一个是数值特征维度,一个是类别特征维度。构建新特征进行数值特征的进一步优化建模,分析新增特征的效用。

原创粉丝点击