随机森林分类器概率

数据挖掘 Python 预测建模 随机森林 阶级失衡
2022-03-08 12:09:19

我的数据集有 140k 行,其中 5 个属性和 1 个 Attrition 作为目标变量(值可以是 0(客户流失)或 1(客户不流失))。我将我的数据集分为 80% 的训练和 20% 的测试。我的数据集严重不平衡。我的数据集 84% 的目标变量为 0,只有 16% 的目标变量为 1。

我的训练数据集的特征重要性如下:

A 栏 = 28%,B 栏 = 27%,年费 - 17%,D 栏 - 17% 和 E 栏 - 11%

我最初想对我的模型做一个非常简单的检查。创建随机森林分类器后,我在只有 5 行的数据集上测试了模型。我保持所有变量不变,除了列年费。下面是我的测试数据集的快照:

 Column A   Column B    AnnualFee   ColumnD ColumnE
 4500       3.9          5%         2.1      7
 4500       3.9          10%        2.1      7
 4500       3.9          15%        2.1      7
 4500       3.9          20%        2.1      7
 4500       3.9          25%        2.1      7

我预计随着年费的增加,客户流失的可能性也会增加。但是我的rf.predict_proba(X_test)似乎到处都是。我不确定为什么会这样:

我尝试了两种不同的代码,但两种代码似乎都发生了异常:

代码 1:

rf = RandomForestClassifier(n_estimators = 400,random_state = 0, 
min_samples_split=2,min_samples_leaf=5,
                      class_weight = {0:.0001,1:.9999})
rf.fit(X_train, Y_train )

代码 2:不是我的代码 - 在线获取

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import GridSearchCV
clf_4 = RandomForestClassifier(class_weight = {0:1,1:5})
estimators_range = np.array([2,3,4,5,6,7,8,9,10,15,20,25])
depth_range = np.array([11,21,35,51,75,101,151,201,251,301,401,451,501])
kfold = 5
skf = StratifiedKFold(n_splits = kfold,random_state = 42)

model_grid = [{'max_depth': depth_range, 'n_estimators': estimators_range}]
grid = GridSearchCV(clf_4, model_grid, cv = StratifiedKFold(n_splits = 5, 
random_state = 42),n_jobs = 8, scoring = 'roc_auc')
grid.fit(X_train,Y_train)

我真的很感激这方面的任何帮助!

2个回答
  1. “到处都是”是什么意思?您是否尝试过使用准确度分数、AUC 等评分方法?这些将在确定模型的性能方面发挥至关重要的作用。我建议从 ROC AUC 开始,因为由于类不平衡,准确性会产生很大的误导。

  2. 您使用的班级权重没有什么意义。您通常会使用类似的东西n_samples / (n_classes * np.bincount(y))来加权,但由于 sklearn 提供类的自动平衡,您可能应该通过设置来使用它class_weights='balanced':http: //scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

您可以直接强制执行单调性。 sklearns RF 似乎不支持这一点(https://stats.stackexchange.com/questions/383423/how-to-enforce-a-monotonic-answer-in-a-single-feature-in-a-binary-分类),但 XGBoost(https://xgboost.readthedocs.io/en/latest/tutorials/monotonic.html)和其他一些人这样做。

当然,总体上改进模型是好的(有关一些初始步骤,请参见 Carlo 的回答);你对单调性的直觉可能在现实中并不成立。