kaggle数字识别题目
介绍和数据地址:https://www.kaggle.com/c/digit-recognizer
解法:python.sklearn的随机森林方法
不只
# -*- coding: utf-8 -*- """ Created on Wed Nov 25 20:39:46 2015 @author: Ning LI """ import numpy as np; import pandas as pd; import sklearn as sk; from sklearn.ensemble import RandomForestClassifier as rf_clf from sklearn import metrics #数据准备 df_train=pd.read_csv('train.csv') df_test=pd.read_csv('test.csv') X_train=df_train.iloc[:,1:] y_train=df_train.iloc[:,0] X_test=df_test.iloc[:] #使用随机森林进行数据训练 clf_initial=rf_clf(n_estimators=33) #使用KFold进行交叉验证,也就是将X_train训练集均分5份,其中4份用于交叉验证的训练,另外一份用于交叉验证。 clf_validated=KFold_cv(X_train.values, y_train.values, clf_initial) #交叉验证完毕后,如果正确率不错,将模型用于X_test测试集的预测 y_pred=clf_validated.predict(X_test) #预测完数据后,将数据按照提交格式分成ImageId和Label两列,保存为csv文件 ImageId=[i+1 for i in range(y_pred.shape[0])] pred_packdata=np.vstack((ImageId,y_pred)).transpose() df_pred=pd.DataFrame(pred_packdata, columns=['ImageId','Label']) df_pred.to_csv('pred.csv') #交叉验证函数 from scipy.stats import sem import sklearn.cross_validation as cross_valid def KFold_cv(X_train,y_train, clf): # leave one out: train 4: test 1 # LeaveOneOut num=X_train[:].shape[0] kf=cross_valid.KFold(num,5) for train_index, test_index in kf: # to train X_train_cv = X_train[train_index] print ("out of train_index{0.3f}"),format(train_index) y_train_cv = y_train[train_index] # to validate X_test_cv = X_train[test_index] y_test_cv = y_train[test_index] clf=clf.fit(X_train_cv,y_train_cv) y_test_pred=clf.predict(X_test_cv) accuracy=metrics.accuracy_score(y_test_cv,y_test_pred) print ("Mean score: {0:.3f} (+/-{1:.3f})").format(np.mean(accuracy),sem(accuracy)) return clf
交叉验证的时候正确率大概在95.6-95.8,所以没有过拟合问题。
测试集的正确率在95.614。 两个差距很小。
值得一提的是,我看到有的资料(见参考资料)说随机森林不会过拟合,所以也不需要担心。
因为两个随机性,
一个是每颗树的训练样本,是用拔靴法bootstrap出来的,所以不同的树之间的训练样本差异性是比较大的,所以在训练样本上使得不同的树的预测方向是不太一样的,使得整个森林对训练样本的抗容错能力很强。
另一个是,每个树木训练的过程里面,训练所用的特征也是随机选的,这使得所有的树木对于所有的特征的预测能力都比较平均。
以上两个随机决定了随机森林是不同意overfitting 的。
参考资料
1 scikit-learn KFold交叉验证方法
http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html
2 随机森林不容易overfitting
http://www.cnblogs.com/maybe2030/p/4585705.html
3. Learning Scikit-Learn. Garreta. et al