sklearn实战:决策树算法预测美国居民收入


前言

最近帮师弟做了一个数据挖掘的大作业,觉得多少还是有点心得,乘兴记录一下( -з)


问题陈述

Over 40,000 instances, mix of continuous and discrete
数据集网址:http://archive.ics.uci.edu/ml/machine-learning-databases/adult/


目标

determine whether a person makes over 50K a year
Class: >50K, <=50K


字段说明:


实验过程


1.数据预处理

源数据中,测试集和训练集数据中都有包含缺省值的行('?')
比如:

25, ?, 200681, Some-college, 10, Never-married, ?, Own-child, White, Male, 0, 0, 40, United-States, <=50K

在这里,将这些行去除掉

数据预处理程序:

# -*- coding: UTF-8 -*-

rs = open('./data/new_adult.csv', 'w')

with open('./data/adult.csv') as file:
    for line in file:
        if '?' in line:
            continue
        else:
            rs.write(line)

rs.close()

2.用决策树 和 随机森林 分别预测收入情况

本过程前期包含数据预处理

主要工作有:
1.读取数据
2.忽略不必要的列
3.将文本项转成数字
4.主成成分分析(PCA)
5.决策树算法、随机森林 进行收入预测
6.决策树可视化

python(使用了sklearn包)代码以及备注如下:

# -*- coding: UTF-8 -*-

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

import sys
import os
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

__author__ = 'Su'

"""
算法一:决策树算法(gini系数/entropy信息熵增益)
算法二:随机森林算法(a.10个决策树分支  b.100个决策树分支)
"""

names = ("age, workclass, education, education-num, "
         "marital-status, occupation, relationship, race, sex, "
         "capital-gain, capital-loss, hours-per-week, "
         "native-country, income").split(', ')

data = pd.read_csv('./data/new_adult.csv',names = names,usecols=[0,1,3,4,5,6,7,8,9,10,11,12,13,14])
#读取数据预处理后的训练集数据(省略了第二行数据。原因:第二行为编号,不构成数据筛选条件)

data_test = pd.read_csv('./data/new_test.csv',names = names,usecols=[0,1,3,4,5,6,7,8,9,10,11,12,13,14])
#读取数据预处理后的测试集数据(省略了第二行数据。原因同上)

# print data.head()
# print data.count()
# print data.describe()

for name in ["workclass","education", "marital-status", "occupation", "relationship", "race", "sex", "native-country", "income"]:
    col = pd.Categorical.from_array(data[name])
    data[name]=col.codes
#文本属性转数组

for name in ["workclass","education", "marital-status", "occupation", "relationship", "race", "sex", "native-country", "income"]:
    col1 = pd.Categorical.from_array(data_test[name])
    data_test[name]=col1.codes
#文本属性转数组

# print data

X_train = data[['age','workclass','education','education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country']]
#训练集X
y_train = data[['income']]
#训练集y

X_test = data_test[['age','workclass','education','education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country']]
#测试集X
y_test = data_test[['income']]
#测试集y

# print X_test.head()
# print y_test.head()

# print X_train.head()
# print y_train.head()

from sklearn import preprocessing
#sklearn数据标准化函数

"""
公式为:(X-mean)/std  计算时对每个属性/每列分别进行。
将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。
"""

# X = np.array(data)
# X_scaled = preprocessing.scale(X)

X_train = preprocessing.scale(np.array(X_train))
y_train = np.array(y_train)
X_test = preprocessing.scale(np.array(X_test))
y_test = np.array(y_test)

from sklearn import tree

clf = tree.DecisionTreeClassifier(criterion='gini')
clf = clf.fit(X_train,y_train)

#entropy
clf_entropy = tree.DecisionTreeClassifier(criterion='entropy')
clf_entropy = clf_entropy.fit(X_train,y_train)

print clf.score(X_test,y_test)
#准确率  0.805976095618  gini系数

print clf_entropy.score(X_test,y_test)
#准确率  0.808100929615  信息熵增益


X_train_cov = np.cov(X_train.T)
X_train_eig = np.linalg.eig(X_train_cov)
# print X_train_eig
#上面三行是主成成分分析(PCA),各项特征值(下面的特征值矩阵)均未达到可以忽略不计的地步,故保留所有属性

"""
array([ 2.08371954,  0.38413677,  1.40465934,  0.60817972,  0.69172145,
        1.12767226,  0.83234406,  0.85438115,  1.09623844,  0.91510361,
        0.96803332,  0.99929443,  1.03494693])
"""

from sklearn.ensemble import RandomForestClassifier
clf2 = RandomForestClassifier(n_estimators=10)
clf3 = RandomForestClassifier(n_estimators=100)
clf2 = clf2.fit(X_train,y_train)
clf3 = clf3.fit(X_train,y_train)

print clf2.score(X_test,y_test)
#准确率  0.836387782205  10个决策树

print clf3.score(X_test,y_test)
#准确率  0.840571049137  100个决策树



# with open("./graph/clf.dot",'w') as f:
#     f = tree.export_graphviz(clf, out_file=f)
#
# import pydotplus
# dot_data = tree.export_graphviz(clf, out_file=None)
# graph = pydotplus.graph_from_dot_data(dot_data)
# graph.write_pdf("clf.pdf")

#决策树可视化代码

Ps:关于sklearn决策树可视化的一些说明

1.环境搭建

scikit-learn中决策树的可视化一般需要安装graphviz。主要包括graphviz的安装和python的graphviz插件的安装。

第一步是安装graphviz。下载地址在:http://www.graphviz.org/。如果你是linux,可以用apt-get或者yum的方法安装。如果是windows,就在官网下载msi文件安装。无论是linux还是windows,装完后都要设置环境变量,将graphviz的bin目录加到PATH,比如我是windows,将C:/Program Files (x86)/Graphviz2.38/bin/加入了PATH

第二步是安装python插件graphviz: pip install graphviz

第三步是安装python插件pydotplus。这个没有什么好说的: pip install pydotplus

这样环境就搭好了,有时候python会很笨,仍然找不到graphviz,这时,可以在代码里面加入这一行:

os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

注意后面的路径是你自己的graphviz的bin目录。

2.决策树可视化的三种方法

首先载入类库:

from sklearn.datasets import load_iris
from sklearn import tree
import sys
import os       
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

接着载入sciki-learn的自带数据,有决策树拟合,得到模型:

iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

现在可以将模型存入dot文件iris.dot。

with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)

这时候我们有3种可视化方法,第一种是用graphviz的dot命令生成决策树的可视化文件,敲完这个命令后当前目录就可以看到决策树的可视化文件iris.pdf.打开可以看到决策树的模型图。

1.

#注意,这个命令在命令行执行
dot -Tpdf iris.dot -o iris.pdf

2.

第二种方法是用pydotplus生成iris.pdf。这样就不用再命令行去专门生成pdf文件了。(此方法好用的)

import pydotplus 
dot_data = tree.export_graphviz(clf, out_file=None) 
graph = pydotplus.graph_from_dot_data(dot_data) 
graph.write_pdf("iris.pdf") 

3.

第三种办法,直接把图产生在ipython的notebook。代码如下:

from IPython.display import Image  
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png()) 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • 原文章为scikit-learn中"用户指南"-->"监督学习的第十节:Decision Trees"######...
    HabileBadger阅读 6,058评论 0 7
  • 写在之前 想看程序参数说明的请到: http://scikit-learn.org/stable/modules/...
    hainingwyx阅读 27,259评论 7 24
  • 敲黑板了啊,答疑时间到。如果你没有良好的Python编程基础,在尝试应用数据科学方法时遇到了问题和困难,又不知道该...
    王树义阅读 7,624评论 14 55
  • 环境管理管理Python版本和环境的工具。p–非常简单的交互式python版本管理工具。pyenv–简单的Pyth...
    MrHamster阅读 3,782评论 1 61
  • 1、决策树算法 决策树(decision tree)又叫判定树,是基于树结构对样本属性进行分类的分类算法。以二分类...
    JasonJe阅读 2,759评论 0 22