python 随机森林分类 DecisionTreeClassifier 随机搜索优化参数 GridSearchCV

@python 随机森林分类模型 随机优化参数

学习笔记

随机森林

1.随机森林模型
随机森林算法是基于决策树算法的Begging优化版本,通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。
决策树是一个监督学习模型,可用于分类和回归,它是一个由内节点和叶节点构成的树型结构。每个内节点对应了一个关于某种特征的测试,通过测试可以把样本分开。最后位于同一叶子节点的样本被分为某一类。
决策树的划分依据:熵反映了事件的不确定性,对于一般分布事件而言,熵是各种可能性的熵以概率为权重进行加和。属性划分的标准是让每个分支纯度更高,最好是每个分支的数据尽可能属于同一类别,其实就是尽可能增加分类的确定性。而熵表示了事件的不确定性,消除熵可以增加事件的确定性,所以只需计算划分前后熵的变化,依次计算各个属性的信息增益然后选择最大的那个属性来划分分支。
随机森林模型包含许多决策树,从而可以将这个包含许多决策树的模型看做一整个森林,随机性体现在两个方面,首先是数据采样的随机,训练数据取自整个数据集中的一部分,如果每一个树模型的输入数据都是不同的,并且是有放回的采样,那么每棵树得到的结果必然也会有所差异,这是第一重随机。接下来还需考虑一下特征,如果对不同的树模型选择不同的一部分特征进行建模,结果的差异就会更大。对不同的树选择不同的部分特征进行建模,就把差异放大了,这就是第二重随机。有这两重随机性,就可以提高森林的多样性,这样再求它们的平均,结果能更稳定有效。
在本模型中首先通过测试集所给的用户基本信息,借贷信息,等设为特征值,以此来构建决策树的根节点,叶节点,来进行决策,完成对申贷客户的识别。
之后将决策树构建为随机森林,解决决策树中欠拟合,过拟合等问题,以此来提高模型的准确度。

随机搜索

我们使用Scikit-Learn 的RandomizedSearchCV 来寻找最佳的超参数组合,进行模型优化,随机搜索是用交叉验证来评估超参数值的所有组合,当超参数的搜索范围较大时,通常会优先选择使用 RandomizedSearchCV 。它不会尝试所有可能的组合,而是在每次迭代中为每个超参数选择一个随机值,然后对一定数量的随机组合进行评估。这种方法有两个优点,如果运行随机1000个迭代,那么将会探索每个超参数的1000个不同的值,而不是只探索少量的值,并且通过简单地设置迭代次数,可以更好地控制要分配给超参数搜索的计算预算。它相比于网格搜索有着更好的随机性,能够在相同时间内探索更多可能的区域,但也会带来不确定性。
本模型中通过随机搜索来对随机森林模型中bmax_features, n_estimators等参数选取最优解,以此来提高我们模型的准确度。

数据预处理

1.转换为csv格式。
2.将5个csv文件分别按id排序。
3.将bhv_train.csv、cust_train.csv、train_label.csv按id合并为一个矩阵,将bhv_test.csv、cust_test.csv按id合并为一个矩阵。
4.将合并后的文件空缺部分用算法补全
5.将数据进行挑选

// ! unzip ../input/toUser.zip -d ../output/data #压缩文件解压
pip install openpyxl
#测试集数据合并 query函数--挑选符合条件的数据并列出;sort_value函数--排序;merge函数---合并
y=train_label.query('label==1')
c=train_label.sort_values(['id'])#按照id排序
a=train_a.sort_values(['id'])
b=train_b.sort_values(['id'])
result = pd.merge(a,b)
train = pd.merge(result,c)
#最终合并完成的train
train.to_csv('train.csv')
#数据填充 fillna
train=train.fillna(train.interpolate())
#查看填充结果
print(train.isnull().sum())
#不同数值的相关度计算 corr_matrix
corr_matrix = train.corr()
corr_matrix.to_csv('corr_matrix.csv')
#和label的相关度比较 【-11>0为正相关;<0为负相关
corr_matrix["label"].sort_values(ascending=False)
#合并测试集
test_a.fillna(test_a.median(),inplace=True)
test_b.fillna(test_b.median(),inplace=True)
a=test_a.sort_values(['id'])
b=test_b.sort_values(['id'])
test = pd.merge(a, b)
test=test.fillna(test.interpolate())
#test=test.fillna(0)
test.to_csv('test.csv')
#处理特征值  drop函数扔掉列数据
traindf= train.drop('label',axis=1)
traindf=traindf.drop('id',axis=1)
traindf

随机森林代码

重要参数

max_depth:树深
max_features:特征数
n_estimators:随机森林里决策树的棵树
criterion: 特征选取方法,可以是gini(基尼系数),entropy(信息增益),通常选择gini,即CART算法,如果选择后者,则是ID3和C4,.5

#训练集训练
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.tree import DecisionTreeClassifier # 决策树
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier # 随机森林
#tree_reg = DecisionTreeClassifier(max_depth=5,random_state=123)
X=traindf  ##去掉label
y=train['label']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.32,random_state=123)
tree_reg = RandomForestClassifier(bootstrap= False, max_features=8, n_estimators= 152)
#tree_reg = RandomForestClassifier(oob_score=True)
tree_reg.fit(X_train, y_train)
y_pr =tree_reg.predict(X_test)#直接预测结果为numpy,需要转换为DataFrame
#numpy转换DataFrame语句
a=pd.DataFrame()
a['预测值']=list(y_pr)
a['实际值']=list(y_test)
#score函数--计算预测得分,正确率
score=accuracy_score(y_pr,y_test)
#预测概率计算
y_pred_proba=tree_reg.predict_proba(X_test)
b=pd.DataFrame(y_pred_proba,columns=['label=0','label=1'])
a['pred_prob']=b['label=1']          #pr的
a['pred_label']=list(y_pr)    
print('得分:', score)
#各个特征值的重要性
tree_reg.feature_importances_

随机搜索优化参数代码

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
#训练集训练
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.tree import DecisionTreeClassifier # 决策树
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier # 随机森林
#tree_reg = DecisionTreeClassifier(max_depth=5,random_state=123)
X=traindf  ##去掉label
y=train['label']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.32,random_state=123)
tree_reg = RandomForestClassifier(bootstrap= False, max_features=8, n_estimators= 152)
#tree_reg = RandomForestClassifier(oob_score=True)
tree_reg.fit(X_train, y_train)
y_pr =tree_reg.predict(X_test)

param_distribs = {
        # 均匀离散随机变量
        'n_estimators': randint(low=1, high=200),
        'max_features': randint(low=7, high=9),
    }

tree_reg = RandomizedSearchCV(tree_reg, param_distributions=param_distribs,
                                n_iter=10, cv=5, scoring='neg_mean_squared_error', random_state=42)
tree_reg.fit(X_train, y_train)
tree_reg.best_params_

网格优化参数代码

#最佳参数预测
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.tree import DecisionTreeClassifier # 决策树
from sklearn.model_selection import train_test_split #训练集与测试集划分
from sklearn.ensemble import RandomForestClassifier # 随机森林
from sklearn.model_selection import GridSearchCV #随机搜索参数
#tree_reg = DecisionTreeClassifier(max_depth=5,random_state=123)
#tree_reg = RandomForestClassifier()
# 模型训练
X=traindf
y=train['label']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.32,random_state=123) #test_size=0.32,训练集与测试集比例划分
#tree_reg.fit(X_train, y_train)
param_grid = [
    # 尝试3×4=12种超参数组合
    {'n_estimators': [10, 30, 50], 'max_features': [2, 4, 6, 8,10]},
    # 之后设置bootstrap=False,再尝试2×3=6种超参数组合
    {'bootstrap': [False], 'n_estimators': [3, 10,], 'max_features': [2, 3, 4,10]},
  ]

forest_reg = RandomForestClassifier(random_state=42)
# 训练5次,总共(12+6)×5=90次
tree_reg = GridSearchCV(forest_reg, param_grid, cv=5,
                           scoring='neg_mean_squared_error',
                           return_train_score=True)
tree_reg.fit(X_train, y_train)
y_pr = tree_reg.predict(X_test)
a=pd.DataFrame()
a['预测值']=list(y_pr)
a['实际值']=list(y_test)
score=accuracy_score(y_pr,y_test)
y_pred_proba=tree_reg.predict_proba(X_test)
b=pd.DataFrame(y_pred_proba,columns=['label=0','label=1'])
print('得分:', score)
tree_reg.best_params_
  • 4
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您想了解如何使用GridSearchCVPython中的随机森林进行优化。这是一个非常好的问题! GridSearchCV是一个超参数优化算法,它可以帮助您找到最优的超参数组合,以优化您的模型。对于随机森林,您可以使用GridSearchCV来调整一些超参数,例如树的数量、最大深度、最小叶子数量等。 下面是一个使用GridSearchCV优化随机森林的示例代码: ``` python from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV from sklearn.datasets import make_classification # 创建一个分类数据集 X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, random_state=42) # 定义随机森林分类器 rfc = RandomForestClassifier(random_state=42) # 定义要调整的超参数 param_grid = { 'n_estimators': [100, 200, 300], 'max_depth': [5, 10, 15], 'min_samples_leaf': [1, 2, 4] } # 使用GridSearchCV搜索最佳超参数组合 grid_search = GridSearchCV(estimator=rfc, param_grid=param_grid, cv=5) grid_search.fit(X, y) # 输出最佳超参数组合和对应的准确率 print("Best parameters found: ", grid_search.best_params_) print("Best accuracy found: ", grid_search.best_score_) ``` 在这个例子中,我们使用随机森林分类器和一个分类数据集,然后定义了要调整的超参数。接下来,我们使用GridSearchCV算法搜索最佳超参数组合,使用5折交叉验证评估每个超参数组合的准确率。最后,我们输出找到的最佳超参数组合和对应的准确率。 希望这个例子能够为您提供一些有用的信息,以优化您的随机森林模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值