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

1、观察数据集

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

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_['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))))

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值