【机器学习】Sklearn特征工程构建与优化
2017-12-10 21:04
253 查看
1、观察数据集
主要观察数据集的信息和质量,方便之后处理
根据打印出来的结果,可以观察样本比例略不均衡,但是差别不大。同时注意到有缺失值,在训练之前需要进行处理。
2、数据预处理
观察特征,进行挑选
剔除无效的信息及其相关的数据集
3、处理缺失值数据
补全缺失值的目的就是为了尽量保持原始的信息状态。处理手段主要有如下几种:
a>扔掉缺失值
b>按照某个统计量补全,统计量可以是定值、均值、中位数
c>拿模型预测缺失值
4、归一化数据集
5、处理类别意义的特征
数据集中的Cabin的缺失过于严重,可以将‘有无’这一新信息进行处理。
进行one_hot编码,采用pd.get_dummies()方式
6、整合数据
接下来可以将处理好的数据维度合并进去,把不需要的维度扔掉:
7、将处理好的数据进行建模
8、进一步构建非线性的特征
通过人工构建非线性的特征,弥补线性模型对非线性表达式的解释能力不足的问题。特征的非线性的表达式可以分为两类:一类是用于表达数值特征本身的非线性因素;另外一类是用于表达特征与特征之间存在的非线性关联,并且这种关联对结果有帮助。
对于第一种,仅适用于数值特征,对应的构建特征的方式有两种:多项式和离散化。多项式是指构建原有数值的高次方作为特征;离散化指将连续的数值划分一个个区间。高次方让数值内的表达式变得更为复杂,可描述能力强;而离散化则是让模型来拟合逼近真实的关系描述。
9、评估新的特征的作用
最常用的方式就是看模型的成绩是否提升,同时观察模型给特征分配的权重,看特征发挥的作用,上述用SVM方法的时候,用默认rbf核的效果比线性linear核的效果好,但是不能得到权重系数。
总结:
针对数据特征,从两个维度进行构建,一个是数值特征维度,一个是类别特征维度。构建新特征进行数值特征的进一步优化建模,分析新增特征的效用。
主要观察数据集的信息和质量,方便之后处理
import pandas as pd from pandas import DataFrame,Series data_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 df df_ = set_missing_age(data_train) print(df_)
4、归一化数据集
#归一化数据 import sklearn.preprocessing as preprocessing scaler = 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_[ 4000 '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 df df__ = 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 sklearn from sklearn.svm import SVC from sklearn.metrics import accuracy_score dfff = 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.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() 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 sklearn from sklearn.svm import SVC from 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))))
总结:
针对数据特征,从两个维度进行构建,一个是数值特征维度,一个是类别特征维度。构建新特征进行数值特征的进一步优化建模,分析新增特征的效用。
相关文章推荐
- 机器学习之sklearn特征工程
- 总结:sklearn机器学习之特征工程
- 使用sklearn做单机特征工程
- 机器学习深入与强化--特征工程
- 机器学习之特征工程
- 关于机器学习中特征工程的一些实战经验与可直接利用代码的分享
- 机器学习之(四)特征工程以及特征选择的工程方法
- 不会做特征工程的 AI 研究员不是好数据科学家!上篇 - 连续数据的处理方法 本文作者:s5248 编辑:杨晓凡 2018-01-19 11:32 导语:即便现代机器学习模型已经很先进了,也别
- 使用sklearn做单机特征工程
- 机器学习 特征工程之特征选择
- 机器学习——特征工程之概述
- 机器学习——特征工程之线性判别分析LDA
- 机器学习-特征工程
- 机器学习-特征工程
- 机器学习之特征工程
- 【转】使用sklearn做单机特征工程
- 使用sklearn做单机特征工程
- 机器学习 hard concepts 特征构建(feature construction)
- 机器学习入门笔记(三):特征工程
- 【机器学习】特征工程概述