文章目录

  • 1. 鸢尾花数据集分类
    • 使用袋外数据作为测试集
  • 2.泰坦尼克号

1. 鸢尾花数据集分类

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
np.random.seed(42)# 特征
iris_feature = '花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'if __name__ == '__main__':mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falsetry:data = pd.read_parquet('iris.parquet')except:data = pd.read_csv('DATA/iris.data')data.to_parquet('iris.parquet')X = data.iloc[:, :4]y = pd.Categorical(data.iloc[:, 4]).codes# 特征组合-共6个feature_iris = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]plt.figure(facecolor='#FFFFFF', figsize=(10, 9))for i, pair in enumerate(feature_iris):X_pair = X.iloc[:, pair]# 随机森林clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=3)clf.fit(X_pair, y)# 预测y_hat = clf.predict(X_pair)# 统计结果c = np.count_nonzero(y_hat == y)print('特征 :', iris_feature[pair[0]], '+', iris_feature[pair[1]])print('\t预测正确的数目为:', c)print('\t预测准确率为:%.2f%%' % (100 * (float(c) / float(len(y)))))# 画决策边界图M, N = 50, 50x1_min, x1_max = min(X_pair.iloc[:, 0]) - 0.05, max(X_pair.iloc[:, 0]) + 0.05x2_min, x2_max = min(X_pair.iloc[:, 1]) - 0.05, max(X_pair.iloc[:, 1]) + 0.05t1 = np.linspace(x1_min, x1_max, M)t2 = np.linspace(x2_min, x2_max, N)# 生成网格点坐标矩阵x1, x2 = np.meshgrid(t1, t2)# 测试点x_test = np.stack((x1.flat, x2.flat), axis=1)y_test = clf.predict(x_test).reshape(x1.shape)cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])plt.subplot(2, 3, i + 1)plt.pcolormesh(x1,x2,y_test,shading='auto',cmap=cm_light)# 画样本点plt.scatter(X_pair.iloc[:, 0],X_pair.iloc[:,1],c=y,cmap=cm_dark,edgecolors='k')plt.xlabel(iris_feature[pair[0]],fontsize=14)plt.xlabel(iris_feature[pair[1]],fontsize=14)plt.xlim(x1_min,x1_max)plt.ylim(x2_min,x2_max)plt.grid(b=True)plt.tight_layout()plt.suptitle('随机森林对鸢尾花数据集的特征组合的分类结果',fontsize=18)plt.show()

运行结果

特征 : 花萼长度 + 花萼宽度预测正确的数目为: 122预测准确率为:81.88%
特征 : 花萼长度 + 花瓣长度预测正确的数目为: 142预测准确率为:95.30%
特征 : 花萼长度 + 花瓣宽度预测正确的数目为: 144预测准确率为:96.64%
特征 : 花萼宽度 + 花瓣长度预测正确的数目为: 142预测准确率为:95.30%
特征 : 花萼宽度 + 花瓣宽度预测正确的数目为: 143预测准确率为:95.97%
特征 : 花瓣长度 + 花瓣宽度预测正确的数目为: 144预测准确率为:96.64%

使用袋外数据作为测试集

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
np.random.seed(42)# 特征
iris_feature = '花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'if __name__ == '__main__':mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falsetry:data = pd.read_parquet('iris.parquet')except:data = pd.read_csv('DATA/iris.data')data.to_parquet('iris.parquet')X = data.iloc[:, :4]y = pd.Categorical(data.iloc[:, 4]).codes# 特征组合-共6个feature_iris = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]plt.figure(facecolor='#FFFFFF', figsize=(10, 9))for i, pair in enumerate(feature_iris):X_pair = X.iloc[:, pair]# 随机森林clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=3,oob_score=True)clf.fit(X_pair, y)print(clf.oob_score_,end='\t')# 预测y_hat = clf.predict(X_pair)# 统计结果c = np.count_nonzero(y_hat == y)print('特征 :', iris_feature[pair[0]], '+', iris_feature[pair[1]],end='\t')print('预测正确的数目为:', c,end='\t')print('预测准确率为:%.2f%%' % (100 * (float(c) / float(len(y)))))# 画决策边界图M, N = 50, 50x1_min, x1_max = min(X_pair.iloc[:, 0]) - 0.05, max(X_pair.iloc[:, 0]) + 0.05x2_min, x2_max = min(X_pair.iloc[:, 1]) - 0.05, max(X_pair.iloc[:, 1]) + 0.05t1 = np.linspace(x1_min, x1_max, M)t2 = np.linspace(x2_min, x2_max, N)# 生成网格点坐标矩阵x1, x2 = np.meshgrid(t1, t2)# 测试点x_test = np.stack((x1.flat, x2.flat), axis=1)y_test = clf.predict(x_test).reshape(x1.shape)cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])plt.subplot(2, 3, i + 1)plt.pcolormesh(x1,x2,y_test,shading='auto',cmap=cm_light)# 画样本点plt.scatter(X_pair.iloc[:, 0],X_pair.iloc[:,1],c=y,cmap=cm_dark,edgecolors='k')plt.xlabel(iris_feature[pair[0]],fontsize=14)plt.xlabel(iris_feature[pair[1]],fontsize=14)plt.xlim(x1_min,x1_max)plt.ylim(x2_min,x2_max)plt.grid(b=True)plt.tight_layout()plt.suptitle('随机森林对鸢尾花数据集的特征组合的分类结果',fontsize=18)plt.show()
0.7583892617449665   特征 : 花萼长度 + 花萼宽度   预测正确的数目为: 122   预测准确率为:81.88%
0.9261744966442953  特征 : 花萼长度 + 花瓣长度   预测正确的数目为: 142   预测准确率为:95.30%
0.9530201342281879  特征 : 花萼长度 + 花瓣宽度   预测正确的数目为: 144   预测准确率为:96.64%
0.9261744966442953  特征 : 花萼宽度 + 花瓣长度   预测正确的数目为: 142   预测准确率为:95.30%
0.9463087248322147  特征 : 花萼宽度 + 花瓣宽度   预测正确的数目为: 143   预测准确率为:95.97%
0.959731543624161   特征 : 花瓣长度 + 花瓣宽度   预测正确的数目为: 144   预测准确率为:96.64%

当max_depth=10时,出现过拟合

0.7046979865771812   特征 : 花萼长度 + 花萼宽度   预测正确的数目为: 138   预测准确率为:92.62%
0.9395973154362416  特征 : 花萼长度 + 花瓣长度   预测正确的数目为: 148   预测准确率为:99.33%
0.9261744966442953  特征 : 花萼长度 + 花瓣宽度   预测正确的数目为: 145   预测准确率为:97.32%
0.9395973154362416  特征 : 花萼宽度 + 花瓣长度   预测正确的数目为: 147   预测准确率为:98.66%
0.9194630872483222  特征 : 花萼宽度 + 花瓣宽度   预测正确的数目为: 146   预测准确率为:97.99%
0.9463087248322147  特征 : 花瓣长度 + 花瓣宽度   预测正确的数目为: 148   预测准确率为:99.33%

2.泰坦尼克号

数据集下载-提取码:foib
变量说明

survival : 是否活着 (0 = No; 1 = Yes)
pclass : Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)
name :名字
sex : 性别
age :年龄
sibsp :配偶的人数
parch:父母子女人数
ticket:机票编号
fare :乘客票价
cabin:船舱
embarked:登船的港口(C =瑟堡; Q =皇后镇; S =南安普敦)
特别说明:
Pclass是社会经济地位(SES)状态
1st〜上层; 2nd〜中间; 3〜下
年龄以年为单位; 如果年龄小于一(1),则为分数

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: admin
@file: 泰坦尼克号.py
@time: 2021/01/25
@desc:
"""
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import csv
import xgboost as xgb# 读取数据,并数据处理
def loaddata(filename, is_train):# 输出显示设置pd.set_option('display.width', 200)# 加载数据data = pd.read_csv(filename, header=0, index_col=0)# 查看数据前几行print(data.head())# 显示数据整体情况-数据快速统计摘要print('data.describe =\n', data.describe())# 将空格转换为空值data.replace(to_replace=' ', value=np.NAN, inplace=True)# 数据的空值统计print(data.isnull().sum())# 将类别数据转换成数值数据-字典映射data['Sex'] = data['Sex'].map({'female': 0, 'male': 1}).astype(int)# 补充船票价格缺失值# print(len(data['Fare'][data['Fare'] == 0])) # 15if len(data.Fare[data['Fare'] == 0]) > 0:fare = np.zeros(3)for i in range(0, 3):fare[i] = data[data.Pclass == i + 1]['Fare'].dropna().median()print(fare)# 填充对应等级船票价格for i in range(0, 3):data.loc[(data.Fare.isnull()) & (data.Pclass == i + 1), 'Fare'] = fare[i]# 年龄处理# 一种是常见的用均值代替缺失值# mean_age = data['Age'].dropna().mean()# data['Age'].fillna(mean_age, inplace=True)# 使用随机森林预测年龄if is_train:print('随机森林开始预测年龄')data_for_age = data[['Age', 'Survived', 'Fare', 'Parch', 'SibSp', 'Pclass']]age_exist = data_for_age.loc[(data.Age.notnull())]age_null = data_for_age.loc[(data.Age.isnull())]print(age_exist)print(age_null)x = age_exist.iloc[:, 1:]y = age_exist.iloc[:, 0]clf = RandomForestRegressor(n_estimators=1000)clf.fit(x, y)age_hat = clf.predict(age_null.values[:, 1:])# print(age_hat)#  把预测的数据填充到Age列的空的那些行中data.loc[(data.Age.isnull()), 'Age'] = age_hatprint('随机森林预测缺失年龄:--over--')else:# 如果是测试数据,则没有Survived这一项,# 所以前面加一个is_train用来判段是测试数据还是训练数据print('随机森林预测缺失年龄2:--start--')data_for_age = data[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]age_exist = data_for_age.loc[(data.Age.notnull())]  # 年龄不缺失的数据age_null = data_for_age.loc[(data.Age.isnull())]print(age_exist.isnull().sum())x = age_exist.values[:, 1:]y = age_exist.values[:, 0]rfr = RandomForestRegressor(n_estimators=1000)rfr.fit(x, y)age_hat = rfr.predict(age_null.values[:, 1:])# print age_hatdata.loc[(data.Age.isnull()), 'Age'] = age_hatprint('随机森林预测缺失年龄2:--over--')# 起始城市data.loc[(data.Embarked.isnull()), 'Embarked'] = 'S'  # 保留缺失出发城市# data['Embarked'] = data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2, 'U': 0}).astype(int)# print(data['Embarked'])# 取出Embarked这一列的数据,pd.get_dummies表示获得出发城市的哑元,就是有什么值embarked_data = pd.get_dummies(data.Embarked)print('embarked_data = \n', embarked_data)# 把所有出发城市拿出来,加上后缀,形成三个特征embarked_data = embarked_data.rename(columns=lambda x: 'Embarked_' + str(x))# 数据和这个新的特征组合在一起,形成新的数据data = pd.concat([data, embarked_data], axis=1)print(data.describe())# 保存数据data.to_csv('New_Data.csv')# 把清洗后的数据提取出来作为xx = data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']]y = None# 如果是训练集,提取yif 'Survived' in data:y = data['Survived']# 转成对应的矩阵x = np.array(x)y = np.array(y)# 平铺五行,让测试数据变得更多# 可以显著提高准确率x = np.tile(x, (5, 1))y = np.tile(y, (5,))if is_train:return x, y# print(data.index)return x, data.index# 输出结果
def write_result(c, c_type):file_name = 'Titanic.test.csv'x, passenger_id = loaddata(file_name, False)if c_type == 3:x = xgb.DMatrix(x)y = c.predict(x)y[y > 0.5] = 1y[~(y > 0.5)] = 0predictions_file = open("Prediction_%d.csv" % c_type, "w")open_file_object = csv.writer(predictions_file)open_file_object.writerow(["PassengerId", "Survived"])open_file_object.writerows(zip(passenger_id, y))predictions_file.close()if __name__ == "__main__":# 读取数据x, y = loaddata('Titanic.train.csv', True)# 数据集的分割,这里的test其实是验证数据x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)# 逻辑回归lr = LogisticRegression(penalty='l2')lr.fit(x_train, y_train)y_hat = lr.predict(x_test)lr_acc = accuracy_score(y_test, y_hat)write_result(lr, 1)# 随机森林rfc = RandomForestClassifier(n_estimators=100)rfc.fit(x_train, y_train)y_hat = rfc.predict(x_test)rfc_acc = accuracy_score(y_test, y_hat)write_result(rfc, 2)# XGBoostdata_train = xgb.DMatrix(x_train, label=y_train)data_test = xgb.DMatrix(x_test, label=y_test)watch_list = [(data_test, 'eval'), (data_train, 'train')]param = {'max_depth': 6, 'eta': 0.8, 'silent': 1, 'objective': 'binary:logistic'}# 'subsample': 1, 'alpha': 0, 'lambda': 0, 'min_child_weight': 1}bst = xgb.train(param, data_train, num_boost_round=100, evals=watch_list,early_stopping_rounds=30, verbose_eval=True)y_hat = bst.predict(data_test, ntree_limit=bst.best_ntree_limit)write_result(bst, 3)y_hat[y_hat > 0.5] = 1y_hat[~(y_hat > 0.5)] = 0xgb_acc = accuracy_score(y_test, y_hat)print('Logistic回归:%.3f%%' % lr_acc)print('随机森林:%.3f%%' % rfc_acc)print('XGBoost:%.3f%%' % xgb_acc)
Logistic回归:0.797%
随机森林:0.983%
XGBoost:0.983%

6.4 随机森林实战相关推荐

  1. 基于python的随机森林回归实现_PYTHON | 随机森林实战(代码+详解)

    大家好,我是菜鸟君,之前跟大家聊过R语言的随机森林建模,指路 R语言 | 随机森林建模实战(代码+详解),作为刚过完1024节日的码农算法工程师来说,怎么可能只会用一种语言呢?今天就来说说Python ...

  2. 机器学习随机森林实战:声纳信号分类(附python代码保姆级解析)

    随机森林是一种很常用的机器学习算法,"随机"表示每棵树的训练样本随机以及训练时的特征随机.         训练形成的多棵决策树形成了"森林",计算时我们把每棵 ...

  3. 随机森林实战(分类任务+特征重要性+回归任务)(含Python代码详解)

    1. 随机森林-分类任务 我们使用随机森林完成鸢尾花分类任务: 第一步,导入我们可能需要的包: from sklearn.datasets import load_iris from sklearn. ...

  4. 基于scikit-learn的随机森林调参实战

    写在前面 在之前一篇机器学习算法总结之Bagging与随机森林中对随机森林的原理进行了介绍.还是老套路,学习完理论知识需要实践来加深印象.在scikit-learn中,RF的分类类是RandomFor ...

  5. 15- 决策回归树, 随机森林, 极限森林 (决策树优化) (算法)

    1.  决策回归树: from sklearn.tree import DecisionTreeRegressor model = DecisionTreeRegressor(criterion='m ...

  6. 随机森林图像分类实战:随机森林分类聚类(Kmeans)降维后的数据、随机森林分类聚类(Kmeans)降维后的合成(append)数据

    随机森林图像分类实战:随机森林分类聚类(Kmeans)降维后的数据.随机森林分类聚类(Kmeans)降维后的合成(append)数据 目录

  7. spark 随机森林算法案例实战

    随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数 ...

  8. Python应用实战案例-深入浅出Python随机森林预测实战(附源码)

    前言 组合算法也叫集成学习,在金融行业或非图像识别领域,效果有时甚至比深度学习还要好.能够理解基本原理并将代码用于实际的业务案例是本文的目标,本文将详细介绍如何利用Python实现集成学习中随机森林这 ...

  9. 机器学习-集成之随机森林算法原理及实战

    Bagging和随机森林 前言 集成学习是目前机器学习的一大热门方向.简单来说,集成学习就是组合许多弱模型以得到一个预测结果比较好的强模型.对于常见的分类问题就是指采用多个分类器对数据集进行预测,把这 ...

  10. 随机森林原理_机器学习(29):随机森林调参实战(信用卡欺诈预测)

    点击"机器学习研习社","置顶"公众号 重磅干货,第一时间送达 回复[大礼包]送你机器学习资料与笔记 回顾 推荐收藏>机器学习文章集合:1-20 机器学习 ...

最新文章

  1. 数字证书及网络加解密原理
  2. 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )
  3. 面向对象先导课程——PART3
  4. 数据结构-冒泡排序最优代码(C语言)
  5. linux deepin “debconf: DbDriver “config“: config.dat 被另一个进程锁定:资源暂时不可用“
  6. BZOJ 3786: 星系探索 欧拉游览树
  7. mysql执行计划_mysql的sql执行计划详解
  8. 在批处理文件中启动MediaPlayer播放制定文件
  9. 欧拉回路 欧拉路径
  10. 到底图啥?百度工程师非法控制155台服务器“挖矿”,被判刑3年
  11. Beautiful Soup 4.2.0 文档
  12. 设计模式 (五) 原型模式
  13. 校园卡管理系统-版本二
  14. python report_python之reportlab
  15. uvlayout和MAYA的接口的问题
  16. 兄弟打印机打印时显示服务器内部错误,打印机出现内部错误无法打印什么原因...
  17. 智能问答机器人python_帮帮智能问答机器人中TaskBot任务对话算法实践
  18. 元数据看板的初步设计思路
  19. iMazing怎么恢复备份?iMazing恢复备份教程分享
  20. 培训机构让考java证书有必要吗在线等

热门文章

  1. oracle迁移数据到mysql
  2. java day32【HTML标签:表单标签 、CSS】
  3. 利用skipList(跳表)来实现排序(待补充)
  4. opencv _rect
  5. 【XLL 框架库函数】 TempInt/TempInt12
  6. Web---HTTP请求、重定向、转发和数据压缩
  7. bzoj2002:[Hnoi2010]Bounce 弹飞绵羊
  8. 创建全局SystemTray.ProgressIndicator
  9. 将表中的数据生成SQL脚本,在查询分析器中执行这些脚本后自动将数据导入到SQL Server中...
  10. mysql行级锁 select for update