基于python sklearn的 RandomForest随机森林 类实现

实现RandomForest 随机森林

基于python的sklearn机器学习 类实现

平台
python3.7Anacondasklearn库及配套库
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import cohen_kappa_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix    # 生成混淆矩阵函数
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.preprocessing import StandardScaler
from sklearn.externals import joblib#保存模型
import itertools
class Ctrain_forest:
    '''
    调用sklearn 实现Random Forest功能:
    画混淆矩阵
    输入数据实现训练
    保存模型到指定位置
    调用模型实现预测
    '''
    def plot_confusion_matrix(self,cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues,path="maxtix"):
        """
        画混淆矩阵
        This function prints and plots the confusion matrix.
        Normalization can be applied by setting `normalize=True`.
        画图函数 输入:
        cm 矩阵 
        classes 输入str类型
        title 名字
        cmap [图的颜色设置](https://matplotlib.org/examples/color/colormaps_reference.html)
        """
        if normalize:
            cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
            print("Normalized confusion matrix")
        else:
            print('Confusion matrix, without normalization')
        plt.figure(figsize=(11,8))
        plt.imshow(cm, interpolation='nearest', cmap=cmap)
        plt.title(title)
        plt.colorbar()

        tick_marks = np.arange(len(classes))
        plt.xticks(tick_marks, classes, rotation=45)
        plt.yticks(tick_marks, classes)
        fmt = '.2f' if normalize else 'd'
        thresh = cm.max() / 2.
        for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
            plt.text(j, i, format(cm[i, j], fmt),
                    horizontalalignment="center",
                      color="white" if cm[i, j] > thresh else "black")
        # plt.gca().set_xticks(tick_marks, minor=True)
        # plt.gca().set_yticks(tick_marks, minor=True)
        # plt.gca().xaxis.set_ticks_position('none')
        # plt.gca().yaxis.set_ticks_position('none')
        #plt.grid()
        # plt.gcf().subplots_adjust(bottom=0.1)
        # plt.tight_layout()
        plt.ylabel('True label')
        plt.xlabel('Predicted label')
        #解决中文显示
        plt.rcParams['font.sans-serif']=['SimHei']
        plt.rcParams['axes.unicode_minus'] = False    
        plt.savefig(path,dpi=500)  
        # plt.show()

    def train_forest(self,x,y,path):
        """
        Random Foeset类
        输入:
        x、y以实现训练,path是保存训练过程的路径
        输出:
        clf 模型
        matrix 混淆矩阵
        dd classifi_report
        kappa kappa系数
        acc_1 模型精度
        """
        X_train,data1x,y_train,data1y = train_test_split(x,y,test_size=0.9,random_state=0)
        #寻找最优参数
        depth = np.arange(1,25,4)
        acc_list = []
        for d in depth:
            clf =RandomForestClassifier(bootstrap=True, class_weight="balanced", criterion='gini',
                max_depth=d*10+1, max_features='auto', max_leaf_nodes=None,
                min_impurity_decrease=0.0, min_impurity_split=None,
                min_samples_leaf=3, min_samples_split=3,
                min_weight_fraction_leaf=0.0, n_estimators=140*2+1, n_jobs=-1,
                oob_score=False, verbose=0, warm_start=False)
            clf.fit(X_train, y_train)
            y_pred_rf = clf.predict(data1x)
            acc=accuracy_score(data1y, y_pred_rf)
            acc_list.append(acc)
            print(accuracy_score(data1y, y_pred_rf))  #整体精度
            print(cohen_kappa_score(data1y, y_pred_rf))  #Kappa系数
        #画图
        mpl.rcParams['font.sans-serif'] = ['SimHei']
        plt.figure(facecolor='w')
        plt.plot(depth, acc_list, 'ro-', lw=1)
        plt.xlabel('随机森林决策树数量', fontsize=15)
        plt.ylabel('预测精度', fontsize=15)
        plt.title('随机森林决策树数量和过拟合', fontsize=18)
        plt.grid(True)
        plt.savefig(path,dpi=300)
        #plt.show()
        y_pred_rf = clf.predict(data1x)
        print(accuracy_score(data1y, y_pred_rf))  #整体精度
        #dist=data1y-y_pred_rf
        print(cohen_kappa_score(data1y, y_pred_rf))  #Kappa系数
        matrix=confusion_matrix(data1y, y_pred_rf)
        kappa=cohen_kappa_score(data1y, y_pred_rf)
        dd=classification_report(data1y, y_pred_rf)
        acc_1=accuracy_score(data1y, y_pred_rf)
        """
        # 特征重要性评定
        rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1)
        rnd_clf.fit(x, y)
        for name, score in zip(x, rnd_clf.feature_importances_):
            print(name, score)
        """ 
        return clf,matrix,dd,kappa,acc_1

    def save_model(self,clf,src):
        """
        保存模型到某处
        clf 模型
        src 路径
        """
        joblib.dump(clf, src)
    
    def get_model_predit(self,data,src):
        """
        调用模型实现预测
        输入原始数据
        src 模型路径
        返回预测值
        """
        getsavemodel=joblib.load(src)
        predity=getsavemodel.predict(pd.DataFrame(data))
        return predity

运行结果:调参图

模型
混淆矩阵

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 随机森林是一种基于集成学习的分和回归算法,它通过利用多个决策树的预测结果进行集成来提高模型的准确性和稳定性。基于Python中的scikit-learn,我们可以很方便地使用随机森林算法。 具体步骤如下: 1. 数据准备:首先,我们需要将数据集划分为训练集和测试集。同时,我们也需要将特征属性和目标属性进行分离。 2. 模型训练:使用sklearn中的RandomForestClassifier(分问题)或者RandomForestRegressor(回归问题)来构建随机森林模型。这些提供了一系列的超参数(如树的数量、最大深度等),你可以根据需要进行设置。 3. 特征选择:随机森林可以根据特征的重要性进行特征选择。通过调用模型的feature_importances_属性,我们可以获得每个特征的重要性分数。这样可以帮助我们了解哪些特征对预测结果的贡献更大。 4. 模型评估:使用测试集对训练好的模型进行评估。可以使用准确率、精确率、召回率等指标来评估分问题的模型,使用均方误差(MSE)、决定系数(R方)等指标来评估回归问题的模型。 5. 模型优化:根据评估结果,我们可以调整模型的超参数来进一步提高模型的性能。可以尝试不同的树的数量、最大深度、节点分裂准则等来找到最优的参数组合。 总的来说,随机森林是一种强大而灵活的机器学习算法,可以广泛应用于各种分和回归问题中。通过结合多个决策树的预测结果,它可以降低过拟合的风险,并且能够处理大量的特征和样本。通过使用Python中的scikit-learn,我们可以很方便地构建和应用随机森林模型,这是一种非常值得学习和使用的算法。 ### 回答2: 随机森林Random Forest)是一种机器学习算法,是由多个决策树组成的集成模型。它是基于Pythonscikit-learn实现的。 随机森林通过利用决策树的集成方法来提高模型的准确性和稳定性。它首先会从给定的数据集中随机选择部分数据进行有放回抽样,建立一系列决策树模型。在构建每一个决策树时,它会随机选择特征子集进行决策树的训练。这样做的目的是为了减少过拟合,并且提高模型的泛化能力。 在随机森林中,每个决策树都会按照划分特征的重要性(例如信息增益)来选择最佳的划分点,使得每个树都能尽可能地减小预测误差。而在预测时,每个树都会独立地给出预测结果,最后通过投票或平均来确定最终的预测结果。 随机森林具有以下优点: 1. 随机森林适用于各种型的数据,可以处理离散型和连续型特征,可以用于分和回归问题。 2. 随机森林具有较好的准确性和泛化能力,能够有效地处理大规模的数据集。 3. 随机森林能够评估特征的重要性,可以通过特征选择来提高建模的效果。 4. 随机森林相对于单独的决策树更不容易过拟合,具有更高的稳定性和抗噪能力。 在Pythonscikit-learn中,使用随机森林的步骤如下: 1. 导入随机森林模块:from sklearn.ensemble import RandomForestClassifier(或RandomForestRegressor) 2. 创建随机森林对象:rf = RandomForestClassifier(n_estimators=10, max_depth=5) - n_estimators指定决策树的数量 - max_depth指定每个决策树的最大深度 3. 训练模型:rf.fit(X_train, y_train) 4. 预测分结果:y_pred = rf.predict(X_test) 5. 评估模型的准确率:accuracy = rf.score(X_test, y_test) 6. 查看特征的重要性:importances = rf.feature_importances_ 总而言之,基于Pythonscikit-learn实现随机森林是一种强大的机器学习算法,能够有效地处理各种型的数据,并且具有较好的准确性和泛化能力。通过随机选择特征子集和有放回抽样,随机森林能够降低过拟合的风险,并且能够评估特征的重要性。 ### 回答3: 随机森林Random Forest)是一种基于决策树的集成学习方法,在python中可以使用scikit-learn中的sklearn.ensemble模块来实现随机森林的基本原理是通过构建多个决策树,并对其结果进行综合来做出决策。其中每个决策树的构建过程都是随机的,这包括随机选择特征和随机选择样本。这样可以降低过拟合的风险,并提高模型的鲁棒性和泛化能力。 在使用sklearn.ensemble模块中的RandomForestClassifier和RandomForestRegressor时,我们可以通过一些参数对随机森林模型进行调参。其中一些重要的参数包括: 1. n_estimators:决策树的个数。一般来说,n_estimators越大,模型的性能越好,但同时计算时间也会增加。 2. max_features:每个决策树构建时随机选择的特征数。一般建议将其设置为总特征数的平方根。 3. max_depth:每个决策树的最大深度。通常情况下,max_depth设置为None表示不限制决策树的深度,但这容易导致过拟合。 在使用随机森林模型时,我们可以通过fit()方法对模型进行训练,然后可以使用predict()方法对新数据进行预测。此外,还可以使用score()方法来评估模型的准确性。 总之,随机森林是一种强大的机器学习方法,它可以有效处理高维、复杂的数据,并在一定程度上避免了过拟合问题。使用sklearn中的RandomForestClassifier和RandomForestRegressor模块,我们可以方便地构建和调整随机森林模型,以满足不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值