[机器学习手记]随机森林与数字识别

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



你可能感兴趣的:([机器学习手记]随机森林与数字识别)