数据城堡参赛代码实战篇(六)---使用sklearn进行数据标准化及参数寻优

2018-04-11 15:51:20 浏览数 (1)

小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,分组第19名的成绩进入了复赛,很激动有木有!在上一篇文章中,小编介绍了一下我们准备使用的分类算法,包括决策树算法、朴素贝叶斯分类器、随机森林等等。这一节,小编将带你使用参赛中使用到的sklearn中另外两个重要的技术:数据标准化和网格搜索。

1 上节回顾

首先,小编带你一起回顾一下sklearn中各种分类算法的导入及调用:

决策树

代码语言:javascript复制
from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()

随机森林

代码语言:javascript复制
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier()

朴素贝叶斯

代码语言:javascript复制
from sklearn.naive_bayes import MultinomialNB
mnb=MultinomialNB()

支持向量机

代码语言:javascript复制
from sklearn.svm import SVC
svc=SVC()

梯度提升决策树

代码语言:javascript复制
from sklearn.ensemble import GradientBoostingClassifier
gbdt=GradientBoostingClassifier()

2 读入数据

首先,我们读入合并后的数据,并通过info()方法查看数据的信息:

代码语言:javascript复制
train_x = pd.read_csv('train_x.csv', index_col=0)
train_y = pd.read_csv('train_y.csv', index_col=0, header=None)
test_x = pd.read_csv('test.csv', index_col=0)
train_ys = np.array(train_y).reshape(-1)
print train_x.info()

结果如下:

代码语言:javascript复制
Int64Index: 15118 entries, 31 to 9048
Data columns (total 36 columns):
id              15118 non-null int64
college         15118 non-null int64
order           15118 non-null float64
consume         15118 non-null int64
consumesum      15118 non-null float64
consumeavg      15118 non-null float64
consumemax      15118 non-null float64
remaindersum    15118 non-null float64
remainderavg    15118 non-null float64
remaindermax    15118 non-null float64
en1             15118 non-null float64
sum             15118 non-null float64
time_stamp      15118 non-null float64
dtypes: float64(33), int64(3)
memory usage: 4.3 MB

这里需要注意的是,我们需要对我们的特征值进行变换,如果直接读去csv,得到的将是n行1列的数据,如果在sklearn中运行会报错,我们需要首先转换为1行n列的数据,这里使用的是numpy中的reshape方法。

我们可以看到,训练集中有多个特征,为了计算的方便,我们只选取五个特征,分别是order(学生的成绩排名)、consumeavg(平均消费)、en1(恩格尔系数)、sum(学生借阅图书的次数)、time_stamp(学生进出图书馆的天数)。

代码语言:javascript复制
predict = ['order', 'en1','sum', 'time_stamp', 'consumeavg']
train_x=train_x[predict]
text_x=test_x[predict]

3 标准化数据

sklearn中提供了多种标准化数据的方法,小编采用的是StandardScaler,它将数据转换为均值为0,标准差为1的标准正态分布数据。首先我们导入该方法:

代码语言:javascript复制
from sklearn.preprocessing import StandardScaler

调用的方法很简单:

代码语言:javascript复制
ss = StandardScaler()

接着就要对数据进行处理,首先我们尝试如下的做法:

代码语言:javascript复制
train_x=ss.fit_transform(train_x)

呀,报错了:

代码语言:javascript复制
Traceback (most recent call last):
  File "/Users/shixiaowen/PycharmProjects/help/new_help/predict_model.py", line 48, in <module>
    train_x[c] = ss.fit_transform(train_x[c])
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

这个的意思是说,我们是不能将一个多维的DataFrame进行标准化处理的,需要一列一列的进行处理,所以,我们采用如下的方式对数据进行正确的标准化:

代码语言:javascript复制
for c in predict:
    train_x[c] = ss.fit_transform(train_x[c])
    test_x[c] = ss.transform(test_x[c])

4 网格搜索

数据处理之后,我们可以训练我们的模型,比如我们使用支持向量机算法。如果我们想要试一下不同的参数设置对于结果的影响,那么我们就要不断修正模型的参数,或者使用一个循环,不断的调用。哈哈,其实sklearn提供了叫网格搜索的工具,供我们进行参数寻优,下面小编将带你一探究竟。

首先,我们导入网格搜索方法:

代码语言:javascript复制
from sklearn.grid_search import GridSearchCV

接下来我们需要设置一下我们想要测试的参数以及其对应的值:

代码语言:javascript复制
parameter={
    'gamma':np.logspace(-2,1,4),
    'C':np.logspace(-1,1,3)
}

这里,我们设置了gamma和C两个参数,使用如下的方法进行网格搜索:

代码语言:javascript复制
svmc = SVC()
svm_gs = GridSearchCV(svmc, parameter, n_jobs=-1, verbose=1,cv=5)
svm_gs.fit(train_x, train_ys)

这里,n_jobs设置为-1,表明最大化利用计算资源进行并行计算,cv设置为5表明在训练时将数据集分为五份进行交叉验证。

训练时会有如下输出:

代码语言:javascript复制
[Parallel(n_jobs=-1)]: Done   1 jobs       | elapsed:   11.1s
[Parallel(n_jobs=-1)]: Done  46 out of  60 | elapsed:  1.3min remaining:   23.5s
[Parallel(n_jobs=-1)]: Done  60 out of  60 | elapsed:  1.6min finished

可以使用如下的方法查看最优的参数组合:

代码语言:javascript复制
print svm_gs.best_params_

输出如下:

代码语言:javascript复制
{'C': 10.0, 'gamma': 10.0}

随后sklearn会使用最优参数组合对模型进行训练。我们利用训练好的模型来预测结果:

代码语言:javascript复制
result = svm_gs.predict(test_x)

5 总结

本篇,小编带你一同了解了sklearn中数据标准化和利用网格搜索进行参数寻优的过程,并详细介绍了如何从读入数据到得到预测结果的一个完整建模流程,相信大家都有所收获。下一节,小编将带你体验一下一种更加强大的分类方法,敬请期待!

想了解更多? 那就赶紧来关注我们

0 人点赞