数据分析系列 之python中随机森林算法的应用

1 原理
1.1 随机森林算法:随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

1.2 Matplotlib和Seaborn
Matplotlib:高度定制化绘图,需要设置更多的参数;
Seaborn:定制化能力会比较差,代码更简洁。

1.3 网格搜索GridSearchCV参数详细解析

class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=2*n_jobs’, error_score=raise, return_train_score=’warn’)
# 参数解释:
estimator:scikit-learn分类器接口,需要评分机制score()或者scoring参数设置;
param_grid:参数名称(字符串)作为键的字典以及用作值的参数设置列表(或这样的字典的列表),可以搜索任何参数设置序列;
scoring:字符串,默认值:无;
n_jobs: 并行数,默认值为1;
iid:默认True,True时代表误差估计为所有样本之和,而非各个fold的平均数;
cv:交叉验证参数,默认None,使用三折交叉验证;
verbose:日志冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出;一般取0

2 实践
课题名称:基于RF的红酒品质分析
数据集:葡萄酒数据集
https://archive.ics.uci.edu/ml/datasets/Wine+Quality

代码参考:

# -*- coding: utf-8 -*-
"""
winequality-red data mining
"""
# url: https://archive.ics.uci.edu/ml/datasets/Wine+Quality
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
import warnings

warnings.filterwarnings('ignore') 
# 标准写法,需要加异常判断
try:
    wine = pd.read_csv('winequality-red.csv', sep = ';') 
except:
    print("Cannot find the file!")

print(wine.info())
# 查看数据的基本情况
print(wine.describe())
# 去掉重复记录
# 查看是否有重复记录的方法:wine.duplicated.sum()
wine = wine.drop_duplicates()
# 查看具体的某一类的数量,用饼图展示
wine['quality'].value_counts().plot(kind = 'pie', autopct = '%.2f')
plt.show()
# 查看quality与其它属性的相关性
print(wine.corr().quality)

# 绘图展示
plt.subplot(121)
sns.barplot(x = 'quality', y = 'volatile acidity', data = wine)
plt.subplot(122)
sns.barplot(x = 'quality', y = 'alcohol', data = wine)
plt.show()

from sklearn.preprocessing import LabelEncoder
# bins划分数据,构成左开右闭区间,2468指的是红酒的分数
bins = (2, 4, 6, 8)
# 组名确定
group_names  = ['low', 'medium', 'high']
wine['quality_lb'] = pd.cut(wine['quality'], bins = bins, labels = group_names)
# LabelEncoder分配标签,原因是字符串不适合计算,这样将'low', 'medium', 'high'对应0、1、2
lb_quality = LabelEncoder()    
wine['label'] = lb_quality.fit_transform(wine['quality_lb']) 
# 输出类别分布
print(wine.label.value_counts())

# 将特征和类别分开,存在x和y中
wine_copy = wine.copy()
wine.drop(['quality', 'quality_lb'], axis = 1, inplace = True) 
X = wine.iloc[:,:-1]
y = wine.label

# train_test_split自动选择训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

# 数据归一化
from sklearn.preprocessing import scale     
X_train = scale(X_train)
X_test = scale(X_test)

# 使用sklearn模块完成建模
from sklearn.metrics import confusion_matrix

# n_estimators:建立的子树的数量
rfc = RandomForestClassifier(n_estimators = 200)
# fit方法进行训练集学习
rfc.fit(X_train, y_train)
# predict方法进行测试集预测
y_pred = rfc.predict(X_test)
# 利用混淆矩阵比较预测值和实际值的差别
print(confusion_matrix(y_test, y_pred))

# 这里给出暴力搜索的栅格标准,即子树的数量分别取10,20,30...看gini和entropy最好的子树数量
param_rfc = {
            "n_estimators": [10,20,30,40,50,60,70,80,90,100,150,200],
            "criterion": ["gini", "entropy"]
            }
# GridSearchCV进行调参,适合小数据集,采用的是暴力搜索
# 具体解释见1.3
grid_rfc = GridSearchCV(rfc, param_rfc, iid = False, cv = 5)
grid_rfc.fit(X_train, y_train)
best_param_rfc = grid_rfc.best_params_
print(best_param_rfc)
rfc = RandomForestClassifier(n_estimators = best_param_rfc['n_estimators'], criterion = best_param_rfc['criterion'], random_state=0)
# 训练
rfc.fit(X_train, y_train)
# 预测
y_pred = rfc.predict(X_test)
# 混淆矩阵
print(confusion_matrix(y_test, y_pred))

参考资料:
https://www.icourse163.org/learn/NJU-1001571005?tid=1463102441&from=study#/learn/content?type=detail&id=1240380202&cid=1261816441 用python玩转数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值