赵走x博客
网站访问量:151926
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
资源编号:75905
人工智能
深入浅出Python机器学习
热度:94
在了解了决策树的基本概念和工作原理之后,我们言归正传,让小C 用决策树算法来帮小Q 拿个主意,到底要不要和l相亲对象进一步发展呢?小C 思忖良久,想不出如何建模,突然,他灵光乍现,有了主意……
在了解了决策树的基本概念和工作原理之后,我们言归正传,让小C 用决策树算法来帮小Q 拿个主意,到底要不要和l相亲对象进一步发展呢?小C 思忖良久,想不出如何建模,突然,他灵光乍现,有了主意…… # 1、数据集的准备 网上有一个著名的数据集一-成年人数据集,包括了数万条样本数据。其中,样本特征包括年龄、工作单位性质、统计权重、学历、受教育时长、婚姻状况、职业、家庭情况、种族、性别、资产所得、资产损失、每周工作时长、原籍、收入(大于5 万或者小于等于5 万)。这个数据集用来帮小Q 做决策真是再合适不过了。 于是小C 去下载了这个数据集,下载地址如下: http://archive.ics.uci.edu/ml/machine-learning-databases/adult/ 下载好的数据集是. data 格式的文件,不过不用担心,它其实就是一个CSV 文件,我们可以把它重名为18-1.csv,这样可以直接用Excel 打开。现在来看一下打开后的样子,如图所示是 数据集前十条数据。  从图中,可以看出,从左数第一列是样本人群的年龄; 第二列是样本人群的工作单位性质;第三列是fnlwgt一-final weight ,是一个统计用的权重值;然后依次是学历、受教育时长、婚姻状况、职业、家庭情况、和,,族、性别、资产所得、资产损失、周工作时长、原国籍和收入。下面我们在Jupyter Notebook 里载入这个数据集,输入代码如下: ``` # 导人pandas 库 import pandas as pd # 用pandas 打开csv 文件 data=pd.read_csv('17-3.csv',header=None,index_col=False, names=['年龄','单位性质','权重','学历','受教育时长', '婚姻状况','职业','家庭情况' , '种族','性别','资产所得','资产损失','周工作时长','原籍','收入']) # 为了方便展示, 我们选取其中一部分数据 data_lite=data[['年龄','单位性质','权重','学历','受教育时长','职业','收入']] # 下面看一下数据的前5 行是不是我们想要的结果 display(data_lite.head()) ``` 运行结果:  > ⚠️:为了方便演示,我们只选了年龄、单位性质、学历、性别、周工作时长、职业和收入等特征。 # 2、用get_dummies 处理数据 看到这里,可能有读者朋友会问一个问题,在现在这个数据集中,单位性质、学历、性别、职业还有收入都不是整型数值, 而是字符串,怎么使用我们现在所学的知识进行建模呢? 这里我们要用到pandas 的一个功能,叫作get_dummies ,它可以在现有的数据集上添加虚拟变量, 让数据集变成可以用的格式。这个方法我们在后面的章节还会详细讲解,现在我们先使用它就好了,在Jupyter Notebook 中输入代码如下: ``` # 导人pandas 库 import pandas as pd # 用pandas 打开csv 文件 data=pd.read_csv('17-3.csv',header=None,index_col=False, names=['年龄','单位性质','权重','学历','受教育时长', '婚姻状况','职业','家庭情况' , '种族','性别','资产所得','资产损失','周工作时长','原籍','收入']) # 为了方便展示, 我们选取其中一部分数据 data_lite=data[['年龄','单位性质','权重','学历','受教育时长','职业','收入']] # 使用get_dummies 将文本数据转化为数值 data_dummies=pd.get_dummies(data_lite) # 对比样本原始特征和虚拟变最特征 print('样本原始特征:\n',list(data_lite.columns),'\n') print('虚拟变量特征:\n',list(data_dummies.columns)) ``` 运行结果: ``` 样本原始特征: ['年龄', '单位性质', '权重', '学历', '受教育时长', '职业', '收入'] 虚拟变量特征: ['年龄', '权重', '受教育时长', '单位性质_ ?', '单位性质_ Federal-gov', '单位性质_ Local-gov', '单位性质_ Never-worked', '单位性质_ Private', '单位性质_ Self-emp-inc', '单位性质_ Self-emp-not-inc', '单位性质_ State-gov', '单位性质_ Without-pay', '学历_ 10th', '学历_ 11th', '学历_ 12th', '学历_ 1st-4th', '学历_ 5th-6th', '学历_ 7th-8th', '学历_ 9th', '学历_ Assoc-acdm', '学历_ Assoc-voc', '学历_ Bachelors', '学历_ Doctorate', '学历_ HS-grad', '学历_ Masters', '学历_ Preschool', '学历_ Prof-school', '学历_ Some-college', '职业_ ?', '职业_ Adm-clerical', '职业_ Armed-Forces', '职业_ Craft-repair', '职业_ Exec-managerial', '职业_ Farming-fishing', '职业_ Handlers-cleaners', '职业_ Machine-op-inspct', '职业_ Other-service', '职业_ Priv-house-serv', '职业_ Prof-specialty', '职业_ Protective-serv', '职业_ Sales', '职业_ Tech-support', '职业_ Transport-moving', '收入_ <=50K', '收入_ >50K'] ``` [结果分析] 大家可以看到, get_dummies 很聪明,它把字符串类型的特征拆分开,如把单位性质分为“单位性质Federa l-gov ” “单位性质_Local -gov ”等,如果样本人群的工作单位是联邦政府,那么“单位性质_Federal-gov ”这个特征的值就是1 ,而其他的工作单位性质特征值就会是0 ,这样就把字符串巧妙地转换成了0和1这两个整型数值。get_dummies 把原数据集的特征拆分成了很多列。现在我们把各列分配给特征向量X 和分类标签y,输入代码如下: ``` # 导人pandas 库 import pandas as pd # 用pandas 打开csv 文件 data = pd.read_csv('17-3.csv', header=None, index_col=False, names=['年龄', '单位性质', '权重', '学历', '受教育时长', '婚姻状况', '职业', '家庭情况' , '种族', '性别', '资产所得', '资产损失', '周工作时长', '原籍', '收入']) # 为了方便展示, 我们选取其中一部分数据 data_lite = data[['年龄', '单位性质', '权重', '学历', '受教育时长', '职业', '收入']] # 使用get_dummies 将文本数据转化为数值 data_dummies = pd.get_dummies(data_lite) # 定义数据集的特征值 features=data_dummies.loc[:,'年龄':'职业_ Transport-moving'] # 将特征数值赋值为x X=features.values # 将收入大于5Ok作为预测目标 y=data_dummies['收入_ >50K'].values print('特征形态:{}, 标签形态:{}'.format(X.shape,y.shape)) ``` 运行结果: ``` 特征形态:(32561, 43), 标签形态:(32561,) ``` 在这段代码中, 我们让特征为“年龄”这一列到“职业一Transportation-moving ”这一列,而标签y 是“收入一>50k”这一列, 如果大于50k, 则y= 1 ,反之y=0。 # 3、用决策树建模并做出预测 现在可以清晰看出,数据集中共有32561 条样本数据, 每条数据有44 个特征值,下面就到了大家最熟悉的地方一一一将数据集拆分成训练集和测试集, 然后用决策树算法进行建模, 并对模型进行评估。输入代码如下: ``` # 导人pandas 库 import pandas as pd # 导入tree 模型和数据集加载工具 from sklearn import tree, datasets # 用pandas 打开csv 文件 from sklearn.model_selection import train_test_split data = pd.read_csv('17-3.csv', header=None, index_col=False, names=['年龄', '单位性质', '权重', '学历', '受教育时长', '婚姻状况', '职业', '家庭情况' , '种族', '性别', '资产所得', '资产损失', '周工作时长', '原籍', '收入']) # 为了方便展示, 我们选取其中一部分数据 data_lite = data[['年龄', '单位性质', '权重', '学历', '受教育时长', '职业', '收入']] # 使用get_dummies 将文本数据转化为数值 data_dummies = pd.get_dummies(data_lite) # 定义数据集的特征值 features = data_dummies.loc[:, '年龄':'职业_ Transport-moving'] # 将特征数值赋值为x X = features.values # 将收入大于5Ok作为预测目标 y = data_dummies['收入_ >50K'].values # 将数据及拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 用最大深度为5的随机森林拟合数据 go_dating_tree = tree.DecisionTreeClassifier(max_depth=5) go_dating_tree.fit(X_train, y_train) print("模型得分:{:.2f}".format(go_dating_tree.score(X_test, y_test))) ``` 运行代码,会得到如图所示的结果。 ``` 模型得分:0.79 ``` [结果分析] 可以看到,基于训练数据集训练的模型在测试集得到了0.79的评分,可以说还是可以接受的,也就是说这个模型的预测准确率在79% ,相信完全可以给小Q提供足够的参考了。 通过小Q 的描述,我们知道Mr. Z 年龄是37 岁,在省机关工作,学历是硕士,性别男(当然了…… 〉,每周工作40 小时- , 职业是文员,现在我们把Mr.Z 的数据进行输入,并用模型对他的收入进行预测。输入代码如下: ``` # 将Mr z的数据输入给模型 MrZ = [[37, 40, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] # 使用模型做出预测 dating_dec = go_dating_tree.predict(MrZ) if dating_dec == 1: print("大胆去追求真爱吧,这哥们月薪过5万了") else: print("不用去了,不满足你的要求") ``` 运行代码,我们会得到一个令人心碎的结果: ``` 不用去了,不满足你的要求 ``` [结果分析]是的,机器冷冰冰地告诉小Q 这个残酷的事实, Mr.Z 并不符合她的要求。当然,出于常识, 我们也能清楚省机关的文职工作人员的收入不太可能超过5 万,否则反腐工作就没什么成效了。 >⚠️: 本节中用到的数据集其实是从美国1994 年人口普查数据库抽取而来,而且其中的收入指的是年收入,并非月收入。我们只是用这个数据集来演示决策树的用法,其结论对我们真实生活场景的参考意义不大。以上是使用决策树的一个实例,读者朋友可以试着用同样的数据集,使用随机森林算法再进行一遍预测,看看结果是否会有所不同。 # 4、小结 在本章中,我们先设定了一个问题:小Q 要不要和相亲对象进一步交往。基于这个应用场景我们介绍了决策树和随机森林的原理、用法,以及优势不足等。在掌握了这两个算法之后,我们用数据集训练了决策树模型,并帮小Q 做出了判断, 希望读者朋友可以自己动手试试看用随机森林算法再进行一次预测,试试看调节各项参数对结果有什么影响。 此外, 除了上述我们讲解的功能,决策树和随机森林还有一个特别“体贴”的功能,就是可以帮助用户在数据集中对数据特征的重要性进行判断。这样一来,我们还可以通过这两个算法对高维数据集进行分析,在诸多特征中保留最重要的儿个,这样也便于我们对数据进行降维处理。这部分内容我们在第11 章中还会有详细的讲解。 当然,目前应用广泛的集成算法还有“梯度上升决策树”( Gradient Boosting Decision Trees, GBDT ) , 限于篇幅,本章暂不详细讲解,感兴趣的读者朋友也可以到scikit-leam 官网上查看相关的文档。