上哪一种人更易活下来,Python达成的任意森林算法与简短总计

《泰坦Nick号》都知晓,杰克和露丝的爱情,既美好又难受,在看电影的时候,不知你是不是想过如此3个难点:在【泰坦Nick号】沉船事故中,什么样的人更易于生存下来呢?

正文实例讲述了Python达成的任性森林算法。分享给我们供大家参考,具体如下:

作为一名程序员,我们能够经过数据来预测船员和旅客的生还景况。

轻易森林是数额挖掘中11分常用的分类预测算法,以分类或回归的决策树为基分类器。算法的一些为首要义:

实验楼上有一门学科:【利用随意森林算法预测 Titanic
游客生还概率】
,便是教你接纳机械学习的点子来预测泰坦Nick号上的旅客生还概率。

*对大小为m的多寡集进行样本量同样为m的有放回抽样;
*对K个特征进行自由取样,形成风味的子集,样本量的鲜明方法能够有平方根、自然对数等;
*每棵树完全成形,不开始展览剪枝;
*各种样本的推断结果由每棵树的估摸投票生成(回归的时候,即各棵树的叶节点的平分)

要是您对机械学习感兴趣,那么推荐这些项目课程,该学科将化解分类中的 2
分类职务,即连串只有正面与反面两类(生还或归西)。课程包涵数据清洗及可视化、模型磨练及评估,以及自由森林分类器调参等剧情。

老牌的python机器学习包scikit learn的文书档案对此算法有相比详细的介绍: http://scikit-learn.org/stable/modules/ensemble.html\#random-forests

课程内容:

该科目共分为三个试验,具体如下:

出于个人商讨和测试的指标,基于经典的Kaggle
101泰坦Nick号游客的数据集,建立模型并进行业评比估。竞技页面及连锁数据集的下载:https://www.kaggle.com/c/titanic

一 、数据清洗及可视化

尝试内容:

数据清洗是数据解析中非凡主要的一部分,也最繁琐,做好这一步须求大批量的经历和耐性。那门科目中,小编将和大家一齐,一步步成就那项工作。该实验学习数据清洗的基本思路以及具体操作,同时,练习使用
Pandas 数据解析工具、Seaborn 统计分析可视化工具。

试行知识点:

  • 离群点分析
  • 缺点和失误值处理
  • 偏态分布数据处理

泰坦Nick号的沉淀,是野史上分外资深的海事。突然感到,本人面对的不再是狂暴的多寡,而是用数码挖掘的措施,去商讨具体的历史题材,也是饶有兴趣。言归正传,模型的显要的指标,是可望根据各种旅客的一多重特征,如性别、年龄、舱位、上船地方等,对其是还是不是能生还开始展览展望,是不行独立的二分类预测问题。数据集的字段名及实例如下:

二 、分类模型磨练及评价

尝试内容:

尝试将评估不一致模型的测试精度以及过拟合难题。学习器没有最好,唯有适不适合,模型评估和品质衡量的要害由此可见。该试验的机要在模型评估的落到实处进程,对分类算法不打听的决不顾虑,在下3个实验中,大家将对算法以及开展深远学习。

实验知识点:

  • 陆续验证法
  • 过拟合
  • 读书曲线
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.925 S
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1 C123 S
5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.05 S

③ 、随机森林分类器参数调节

实验内容:

该试验学习集成学习的轻易森林算法,参数调节,并缓解上一节实验个中蒙受的过拟合难题。我们将继续利用
Python sklean 机器学习工具。

尝试知识点:

  • 决策树
  • 合并学习
  • 随意森林算法
  • 参数调节

值得表达的是,SibSp是指sister brother
spouse,即某些旅客随行的兄弟姐妹、老公、老婆的人口,Parch指parents,children

最后

如果您想知道【泰坦Nick号】上哪种人更易活下来,亦或者对机器学习感兴趣,那么点击【利用随机森林算法预测
Titanic
旅客生还可能率】
即可开首攻读,通过祥和的学习,通过数量来评估出哪个种类人更便于生存下来。

  • 假使您对机器学习感兴趣,你也足以点击【机器学习工程师】学习路径,带您通过大气的实战操作精通机器学习。

上面给出整个数据处理及建立模型进程,基于ubuntu+python 3.4(
anaconda科学总结环境已经集成一多重常用包,pandas numpy
sklearn等,那里强烈推荐)

懒得切换输入法,写的时候根本的注释都以英文,中文的诠释是后来补给的:-)

# -*- coding: utf-8 -*-
"""
@author: kim
"""
from model import *#载入基分类器的代码
#ETL:same procedure to training set and test set
training=pd.read_csv('train.csv',index_col=0)
test=pd.read_csv('test.csv',index_col=0)
SexCode=pd.DataFrame([1,0],index=['female','male'],columns=['Sexcode']) #将性别转化为01
training=training.join(SexCode,how='left',on=training.Sex)
training=training.drop(['Name','Ticket','Embarked','Cabin','Sex'],axis=1)#删去几个不参与建模的变量,包括姓名、船票号,船舱号
test=test.join(SexCode,how='left',on=test.Sex)
test=test.drop(['Name','Ticket','Embarked','Cabin','Sex'],axis=1)
print('ETL IS DONE!')
#MODEL FITTING
#===============PARAMETER AJUSTMENT============
min_leaf=1
min_dec_gini=0.0001
n_trees=5
n_fea=int(math.sqrt(len(training.columns)-1))
#==============================================
'''''
BEST SCORE:0.83
min_leaf=30
min_dec_gini=0.001
n_trees=20
'''
#ESSEMBLE BY RANDOM FOREST
FOREST={}
tmp=list(training.columns)
tmp.pop(tmp.index('Survived'))
feaList=pd.Series(tmp)
for t in range(n_trees):
#  fea=[]
  feasample=feaList.sample(n=n_fea,replace=False)#select feature
  fea=feasample.tolist()
  fea.append('Survived')
#    feaNew=fea.append(target)
  subset=training.sample(n=len(training),replace=True)#generate the dataset with replacement
  subset=subset[fea]
#  print(str(t)+' Classifier built on feature:')
#  print(list(fea))
  FOREST[t]=tree_grow(subset,'Survived',min_leaf,min_dec_gini) #save the tree
#MODEL PREDICTION
#======================
currentdata=training
output='submission_rf_20151116_30_0.001_20'
#======================
prediction={}
for r in currentdata.index:#a row
  prediction_vote={1:0,0:0}
  row=currentdata.get(currentdata.index==r)
  for n in range(n_trees):
    tree_dict=FOREST[n] #a tree
    p=model_prediction(tree_dict,row)
    prediction_vote[p]+=1
  vote=pd.Series(prediction_vote)
  prediction[r]=list(vote.order(ascending=False).index)[0]#the vote result
result=pd.Series(prediction,name='Survived_p')
#del prediction_vote
#del prediction
#result.to_csv(output)
t=training.join(result,how='left')
accuracy=round(len(t[t['Survived']==t['Survived_p']])/len(t),5)
print(accuracy)

上述是即兴森林的代码,如上所述,随机森林是一各类决策树的结合,决策树每回不同,用Gini周全衡量当前节点的“不纯净度”,若是依据某些特征的某部区别点对数据集划分后,能够让数据集的Gini降低最多(显明地回落了多少集输出变量的不纯度),则当选当前一级的分割特征及分割点。代码如下:

# -*- coding: utf-8 -*-
"""
@author: kim
"""
import pandas as pd
import numpy as np
#import sklearn as sk
import math
def tree_grow(dataframe,target,min_leaf,min_dec_gini):
  tree={} #renew a tree
  is_not_leaf=(len(dataframe)>min_leaf)
  if is_not_leaf:
    fea,sp,gd=best_split_col(dataframe,target)
    if gd>min_dec_gini:
      tree['fea']=fea
      tree['val']=sp
#      dataframe.drop(fea,axis=1) #1116 modified
      l,r=dataSplit(dataframe,fea,sp)
      l.drop(fea,axis=1)
      r.drop(fea,axis=1)
      tree['left']=tree_grow(l,target,min_leaf,min_dec_gini)
      tree['right']=tree_grow(r,target,min_leaf,min_dec_gini)
    else:#return a leaf
      return leaf(dataframe[target])
  else:
    return leaf(dataframe[target])
  return tree
def leaf(class_lable):
  tmp={}
  for i in class_lable:
    if i in tmp:
      tmp[i]+=1
    else:
      tmp[i]=1
  s=pd.Series(tmp)
  s.sort(ascending=False)
  return s.index[0]
def gini_cal(class_lable):
  p_1=sum(class_lable)/len(class_lable)
  p_0=1-p_1
  gini=1-(pow(p_0,2)+pow(p_1,2))
  return gini
def dataSplit(dataframe,split_fea,split_val):
  left_node=dataframe[dataframe[split_fea]<=split_val]
  right_node=dataframe[dataframe[split_fea]>split_val]
  return left_node,right_node
def best_split_col(dataframe,target_name):
  best_fea=''#modified 1116
  best_split_point=0
  col_list=list(dataframe.columns)
  col_list.remove(target_name)
  gini_0=gini_cal(dataframe[target_name])
  n=len(dataframe)
  gini_dec=-99999999
  for col in col_list:
    node=dataframe[[col,target_name]]
    unique=node.groupby(col).count().index
    for split_point in unique: #unique value
      left_node,right_node=dataSplit(node,col,split_point)
      if len(left_node)>0 and len(right_node)>0:
        gini_col=gini_cal(left_node[target_name])*(len(left_node)/n)+gini_cal(right_node[target_name])*(len(right_node)/n)
        if (gini_0-gini_col)>gini_dec:
          gini_dec=gini_0-gini_col#decrease of impurity
          best_fea=col
          best_split_point=split_point
    #print(col,split_point,gini_0-gini_col)
  return best_fea,best_split_point,gini_dec
def model_prediction(model,row): #row is a df
  fea=model['fea']
  val=model['val']
  left=model['left']
  right=model['right']
  if row[fea].tolist()[0]<=val:#get the value
    branch=left
  else:
    branch=right
  if ('dict' in str( type(branch) )):
    prediction=model_prediction(branch,row)
  else:
    prediction=branch
  return prediction

实际,上面包车型大巴代码还有十分大的频率提高的空中,数据集不是非常的大的场合下,假诺选取二个较大的输入参数,例如生成100棵树,就会鲜明地变慢;同时,将估计结果提交至kaggle开始展览评测,发今后测试集上的正确率不是很高,比使用sklearn里面相应的包实行展望的正确率(0.77512)要稍低一点
🙁  假诺要晋升准确率,七个大方向: 构造新的特色;调整现有模型的参数。

此处是一得之见,欢迎大家对自身的建立模型思路和算法的兑现格局建议修改意见。

越多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python编码操作技巧总括》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

期望本文所述对大家Python程序设计有所支持。

你或者感兴趣的篇章: