小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,分组第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中数据标准化和利用网格搜索进行参数寻优的过程,并详细介绍了如何从读入数据到得到预测结果的一个完整建模流程,相信大家都有所收获。下一节,小编将带你体验一下一种更加强大的分类方法,敬请期待!
想了解更多? 那就赶紧来关注我们