学习笔记——Kaggle_Digit Recognizer (Random Forest算法 Python实现)

本文是个人学习笔记,该篇主要学习随机森林算法概念,并应用sklearn.ensemble.RandomForestClassifier算法包解决Kaggle入门级Digit Recognizer。

  • 随机森林概述
    • 决策树
    • 随机森林分类过程
  • Python 代码

随机森林概述

随机森林就是用随机方式建立一个决策树森林,随机森林的决策树之间相互独立。因此随机森林可以简单理解为基于决策树算法的一种拓展与改进,主要应用于回归与分类。它也是一种数据降维手段,用于处理缺失值、异常值以及其他数据探索中的重要步骤。

其在分类问题上的基本思想是通过训练样本建立起随机森林,每当新样本进入时,让森林中每颗决策树都对该样本进行分类判断,最终通过投票方式确定其最终类别。

决策树

决策树顾名思义是一种树结构,其每个非叶节点表示一个基于特征属性的测试,每个分支代表该特征属性在某个值域上的输出,而每个叶节点存放一个类别。

决策树进行分类决策的过程就是从根节点开始,测试待分类项中对应该节点的特征属性,然后按照其值选择输出分支,到达新节点重复上述判断步骤,直到到达叶子节点,该叶节点类别即为分类判断结果。

随机森林分类过程

  1. 假设原始训练集共有N个样本,利用重复自抽样有放回地随机抽取出k个新的自助样本集(每个样本集中也有N个样本,由于是有放回随机抽取,因此可能会有重复样本,从而避免过拟合),由此构建k棵分类树(二叉树);
  2. 假设训练样本共有M个属性变量,则在每个节点处随机选取其中m个属性变量,然后在其中选择具有最大信息增益(信息增益表示特征值使得数据集不确定性的下降程度,因此信息增益越大,特征分类能力越强)或具有最小基尼指数(基尼指数表示样本集合的不确定性程度,基尼指数越小,对应的特征分类能力越强)的属性为节点分裂属性,变量分类的阈值通过检查每一个分类点确定;
  3. 每棵树最大限度地生长, 不做任何修剪;
  4. 将生成的k棵分类树组成随机森林,用随机森林分类器对新样本进行判别与分类,最终分类结果按每颗决策树分类的投票确定(在回归问题中,随机森林的输出将会是所有决策树输出的平均值);

Python 代码

import pandas as pd
import numpy as np
import time
from sklearn.ensemble import RandomForestClassifier

def data_load():

    # 利用pandas读取csv文件内容
    train_ttl=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\train.csv')
    train_label=pd.DataFrame(train_ttl['label'])
    train_data=pd.DataFrame(train_ttl.ix[:,1:])
    test_data=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\test.csv')

    # dataframe归整化
    test_data[test_data!=0]=1

    # train_data[train_data!=0]=1
    m, n = train_data.shape  # 这里似乎因为dataframe太大,用bool判断更改时总会异常跳出,所以选择循环更改,但慢
    for i in range(m):
        for j in range(n):
            if train_data.ix[i, j] != 0:
                train_data.ix[i, j] = 1

    return train_data,train_label,test_data

#利用Python Sklearn包,进行test样本集分类判别
def rf_classify(traindata,trainlabel,testdata):

    rf_clf = RandomForestClassifier() #设置函数和参数
    rf_clf.fit(traindata,trainlabel.values.ravel())#训练Train样本
    rf_result=rf_clf.predict(testdata)#预测Test样本

    return rf_result

if __name__=='__main__':
    start = time.clock()
    traindata,trainlabel,testdata=data_load()#加载raw data

    m,n=testdata.shape
    result_labels=rf_classify(traindata,trainlabel,testdata)

    #将结果转化成Dataframe结构
    result={}
    ImageId=np.arange(m)+1
    result['Label']=result_labels
    result_frame=pd.DataFrame(result,index=ImageId)

    #导出结果
    result_frame.to_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\result_rf.csv')
    end = time.clock()
    print('总耗时:', (end - start)/60)#1.5小时

你可能感兴趣的:(python学习笔记)