快速入门Python机器学习(20)

简介: 快速入门Python机器学习(20)

10 集成学习


10.1随机森林算法(RandomForest)

10.1.1概念

2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。随机森林在运算量没有显著提高的前提下提高了预测精度。


算法流程:

构建决策树的个数t,单颗决策树的特征个数f,m个样本,n个特征数据集


1 单颗决策树训练

1.1 采用有放回抽样,从原数据集经过m次抽样,获得有m个样本的数据集(可能有重复样本)

1.2 从n个特征里,采用无放回抽样原则,去除f个特征作为输入特征

 1.3 在新的数据集(m个样本, f个特征数据集上)构建决策树

  1.4 重复上述过程t次,构建t棵决策树


2 随机森林的预测结果

生成t棵决策树,对于每个新的测试样例,综合多棵决策树预测的结果作为随机森林的预测结果。

  回归问题:取t棵决策树预测值的平均值作为随机森林预测结果

  分类问题:少数服从多数的原则,取单棵的分类结果作为类别随机森林预测结果

Sklearn中RandomForestClassifier和RandomForestRegressor分类和回归树算法


10.1.2 随机森林分类法

类参数、属性和方法


class sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)


参数

参数

类型

解释

n_estimators

int, default=100

森林中树木的数量。

random_state

RandomState instance or None, default=None

控制生成树时使用的样本引导的随机性(如果bootstrap=True)和在每个节点上查找最佳分割时要考虑的特征的采样(如果max_features < n_features)。


属性

属性

解释

base_estimator_

DecisionTreeClassifier用于创建拟合子估计器集合的子估计器模板。

estimators_

list of DecisionTreeClassifier拟合子估计量的集合。

classes_

ndarray of shape (n_classes,) or a list of such arrays形状数组(n个类)或此类数组的列表类标签(单输出问题),或类标签数组的列表(多输出问题)。

n_classes_

int or list类数(单输出问题),或包含每个输出的类数的列表(多输出问题)。

n_features_

int执行拟合时的特征数。

n_outputs_

int执行拟合时的输出数。

feature_importances_

ndarray of shape (n_features,)基于杂质的特征非常重要。

oob_score_

float使用现成的估计值获得的训练数据集的得分。只有当oob_scoreTrue时,此属性才存在。

oob_decision_function_

ndarray of shape (n_samples, n_classes)利用训练集上的包外估计计算决策函数。如果nèu估计量很小,则可能在引导过程中从未遗漏数据点。在这种情况下,oob_decision_function_可能包含NaN。只有当oob_scoreTrue时,此属性才存在。


方法

apply(X)

将森林中的树应用到X,返回叶子数。

decision_path(X)

返回林中的决策路径。

fit(X, y[, sample_weight])

从训练集(Xy)建立一个树的森林。

get_params([deep])

获取此估计器的参数。

predict(X)

预测X的类。

predict_log_proba(X)

预测X的类对数概率。

predict_proba(X)

预测X的类概率。

score(X, y[, sample_weight])

返回给定测试数据和标签的平均精度。

set_params(**params)

设置此估计器的参数。


随机森林分类参数

d

ef base_of_decision_tree_forest(n_estimator,random_state,X,y,title):
    myutil = util()
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    clf = RandomForestClassifier(n_estimators=n_estimator, random_state=random_state,n_jobs=2)#n_jobs:设置为CPU个数
    # 在训练数据集上进行学习
    clf.fit(X_train, y_train)
    cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF’])
    cmap_bold =  ListedColormap(['#FF0000','#00FF00','#0000FF’])
    #分别将样本的两个特征值创建图像的横轴和纵轴
    x_min,x_max = X_train[:,0].min()-1,X_train[:,0].max()+1
    y_min,y_max = X_train[:,1].min()-1,X_train[:,1].max()+1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                      np.arange(y_min, y_max, .02))
    #给每个样本分配不同的颜色
    Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
    Z = Z.reshape(xx.shape)
plt.pcolormesh(xx,yy,Z,cmap=cmap_light,shading='auto')
       #用散点把样本表示出来
       plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,s=20,edgecolors='k')
       plt.xlim(xx.min(),xx.max()) 
       plt.ylim(yy.min(),yy.max())
       title = title+"数据随机森林训练集得分(n_estimators:"+str(n_estimator)+",random_state:"+str(random_state)+")"
       myutil.print_scores(clf,X_train,y_train,X_test,y_test,title)
def tree_forest():
       myutil = util()
       title = ["鸢尾花","红酒","乳腺癌"]
       j = 0
       for datas in [datasets.load_iris(),datasets.load_wine(),datasets.load_breast_cancer()]:
              #定义图像中分区的颜色和散点的颜色
              figure,axes = plt.subplots(4,4,figsize =(100,10))
              plt.subplots_adjust(hspace=0.95)
              i = 0
              # 仅选前两个特征
              X = datas.data[:,:2]
              y = datas.target
              mytitle =title[j]
              for n_estimator in range(4,8):
                     for random_state in range(2,6):
                            plt.subplot(4,4,i+1)
                            plt.title("n_estimator:"+str(n_estimator)+"random_state:"+str(random_state))
                            plt.suptitle(u"随机森林分类")
                            base_of_decision_tree_forest(n_estimator,random_state,X,y,mytitle)
                            i = i + 1
              myutil.show_pic(mytitle)
              j = j+1


鸢尾花



n_estimators

4

5

6

7

训练集

测试集

训练集

测试集

训练集

测试集

训练集

测试集

random_state

2

89.29%

71.05%

91.07%

71.05%

91.07%

78.95%

91.96%

76.32%

4

91.07%

68.42%

89.29%

76.32%

94.64%

60.53%

91.07%

76.32%

4

91.07%

71.05%

93.75%

78.95%

93.75%

68.42%

91.07%

71.05%

5

90.18%

68.42%

92.86%

78.95%

91.96%

60.53%

92.86%

76.32%












红酒


n_estimators

4

5

8

7

训练集

测试集

训练集

测试集

训练集

测试集

训练集

测试集

random_state

2

96.24%

80.00%

98.50%

68.89%

96.99%

82.22%

97.74%

82.22%

3

92.48%

86.67%

97.74%

80.00%

96.24%

73.33%

98.50%

68.89%

4

95.49%

75.56%

93.98%

84.44%

96.99%

84.44%

98.50%

91.11%

5

96.24%

68.89%

96.99%

82.22%

96.99%

71.11%

98.50%

75.56%












乳腺癌


n_estimators

4

5

6

7

训练集

测试集

训练集

测试集

训练集

测试集

训练集

测试集

random_state

2

97.18%

81.82%

97.65%

90.91%

98.83%

89.51%

99.30%

85.31%

3

97.89%

85.31%

97.65%

80.42%

97.89%

86.71%

98.59%

84.62%

4

97.42%

82.52%

97.89%

88.11%

97.42%

89.51%

97.89%

90.91%

5

97.18%

87.41%

98.83%

88.11%

98.12%

88.81%

98.83%

88.81%












image.png

image.png


image.png

输出

import mglearn
def my_RandomForet():
  # 生成一个用于模拟的二维数据集
  X, y = datasets.make_moons(n_samples=100, noise=0.25, random_state=3)
  # 训练集和测试集的划分
  X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y,random_state=42)
  # 初始化一个包含 5 棵决策树的随机森林分类器
  forest = RandomForestClassifier(n_estimators=5, random_state=2)
  # 在训练数据集上进行学习
  forest.fit(X_train, y_train)
  # 可视化每棵决策树的决策边界
  fig, axes = plt.subplots(2, 3, figsize=(20, 10))
  for i, (ax, tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
      ax.set_title('Tree {}'.format(i))
      mglearn.plots.plot_tree_partition(X_train, y_train, tree, ax=ax)
      print("决策树"+str(i)+"训练集得分:{:.2%}".format(tree.score(X_train,y_train)))
      print("决策树"+str(i)+"测试集得分:{:.2%}".format(tree.score(X_test,y_test)))       
        # 可视化集成分类器的决策边界
      print("随机森林训练集得分:{:.2%}".format(forest.score(X_train,y_train)))
      print("随机森林测试集得分:{:.2%}".format(forest.score(X_test,y_test)))
      mglearn.plots.plot_2d_separator(forest, X_train, fill=True, ax=axes[-1, -1],alpha=0.4)
      axes[-1, -1].set_title('Random Forest')
      mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train)
      plt.show()


决策树0训练集得分:89.33%
决策树0测试集得分:84.00%
决策树1训练集得分:96.00%
决策树1测试集得分:88.00%
决策树2训练集得分:97.33%
决策树2测试集得分:80.00%
决策树3训练集得分:89.33%
决策树3测试集得分:92.00%
决策树4训练集得分:92.00%
决策树4测试集得分:88.00%
随机森林训练集得分:96.00%
随机森林测试集得分:92.00%


虽然决策树3不存在过拟合,决策树4的差值与随机森林得分一致,但是随机森林得分比他们都要高。



训练集

测试集

差值

随机森林

96.00%

92.00%

4

决策树0

89.33%

84.00%

5

决策树1

96.00%

88.00%

8

决策树2

97.33%

80.00%

17

决策树3

89.33%

92.00%

-3

决策树4

92.00%

88.00%

4

image.png

随机森林分类参数散点图分析实例

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/,下载adult.dat文件,改为adult.csv


import pandas as pd
def income_forecast():
        data=pd.read_csv('adult.csv', header=None,index_col=False,
                  names=['年龄','单位性质','权重','学历','受教育时长',
                       '婚姻状况','职业','家庭情况','种族','性别',
                       '资产所得','资产损失','周工作时长','原籍',
                       '收入'])
        #为了方便展示,我们选取其中一部分数据
        data_title = data[['年龄','单位性质','学历','性别','周工作时长','职业','收入']]
        print(data_title.head())
        #利用shape方法获取数据集的大小
        data_title.shape
        print("data_title.shape:\n",data_title.shape)
        data_title.info()


单位性质、学历、性别、职业、收入均不是数值类型

输出

年龄  单位性质        学历  ...       周工作时长   职业                   收入

0  39    State-gov      Bachelors  ...  40            Adm-clerical            <=50K

1  50    Self-emp-not-inc Bachelors  ...  13            Exec-managerial         <=50K

2  38    Private         HS-grad  ...   40            Handlers-cleaners        <=50K

3  53    Private         11th  ...      40            Handlers-cleaners        <=50K

4  28    Private         Bachelors  ...  40           Prof-specialty            <=50K

data_title.shape:

(32561, 7)

Data columns (total 7 columns):

#   Column  Non-Null Count  Dtype

---  ------  --------------  -----

0   年龄      32561 non-null  int64

1   单位性质    32561 non-null  object

2   学历      32561 non-null  object

3   性别      32561 non-null  object

4   周工作时长   32561 non-null  int64

5   职业      32561 non-null  object

6   收入      32561 non-null  object

dtypes: int64(2), object(5)

memory usage: 1.7+ MB

##1-数据准备
#1.2 数据预处理
#用get_dummies将文本数据转化为数值
data_dummies=pd.get_dummies(data_title)
print("data_dummies.shape:\n",data_dummies.shape)
#对比样本原始特征和虚拟变量特征---df.columns获取表头
print('样本原始特征:\n',list(data_title.columns),'\n')
print('虚拟变量特征:\n',list(data_dummies.columns))
##2-数据建模---拆分数据集/模型训练/测试
#2.1将数据拆分为训练集和测试集---要用train_test_split模块中的train_test_split()函数,随机将75%数据化为训练集,25%数据为测试集
#导入数据集拆分工具  
#拆分数据集---x,y都要拆分,rain_test_split(x,y,random_state=0),random_state=0使得每次生成的伪随机数不同
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=0)
#查看拆分后的数据集大小情况
print('x_train_shape:{}'.format(x_train.shape))
print('x_test_shape:{}'.format(x_test.shape))
print('y_train_shape:{}'.format(y_train.shape))
print('y_test_shape:{}'.format(y_test.shape))
##2、数据建模---模型训练/测试---决策树算法
#2.2 模型训练---算法.fit(x_train,y_train)
#使用算法
tree = DecisionTreeClassifier(max_depth=5)#这里参数max_depth最大深度设置为5
#算法.fit(x,y)对训练数据进行拟合
tree.fit(x_train, y_train)
##2、数据建模---拆分数据集/模型训练/测试---决策树算法
#2.3 模型测试---算法.score(x_test,y_test)
score_test=tree.score(x_test,y_test)
score_train=tree.score(x_train,y_train)
print('test_score:{:.2%}'.format(score_test))
print('train_score:{:.2%}'.format(score_train))
##3、模型应用---算法.predict(x_new)---决策树算法
#导入要预测数据--可以输入新的数据点,也可以随便取原数据集中某一数据点,但是注意要与原数据结构相同
x_new=[[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,0]]
#37岁,机关工作,硕士,男,每周工作40小时,文员
prediction=tree.predict(x_new)
print('预测数据:{}'.format(x_new))
print('预测结果:{}'.format(prediction))

输出

特征形态:(32561, 44) 标签形态:(32561,)
x_train_shape:(24420, 44)
x_test_shape:(8141, 44)
y_train_shape:(24420,)
y_test_shape:(8141,)
test_score:79.62%
train_score:80.34%
预测数据:[[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, 0]]
预测结果:[0]
目录
相关文章
|
11天前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
58 7
|
9天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
11天前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
18天前
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
43 9
Python与机器学习:使用Scikit-learn进行数据建模
|
4月前
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
80 0
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
【Python机器学习】文本特征提取及文本向量化讲解和实战(图文解释 附源码)
【Python机器学习】文本特征提取及文本向量化讲解和实战(图文解释 附源码)
564 0
|
10月前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习】K-Means对文本聚类和半环形数据聚类实战(附源码和数据集)
【Python机器学习】K-Means对文本聚类和半环形数据聚类实战(附源码和数据集)
252 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧1
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
98 5
|
5月前
|
机器学习/深度学习 数据采集 分布式计算
【Python篇】深入机器学习核心:XGBoost 从入门到实战
【Python篇】深入机器学习核心:XGBoost 从入门到实战
415 3
|
5月前
|
机器学习/深度学习 算法 数据可视化
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧2
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
67 1

热门文章

最新文章