我的数据集有140 k行,5个属性,1个减值作为目标变量(值可以是0(客户流失),也可以是1(客户不流失))。我把我的数据集分成80%的训练和20%的测试。我的数据集严重不平衡。84%的数据集有0作为目标变量,只有16%的数据集有1作为目标变量。
我的培训数据集的特性重要性如下:
ColumnA = 28%,ColumnB = 27%,AnnualFee- 17%,ColumnD - 17%,ColumnE - 11%
我最初想对我的模型做一个非常简单的检查。在创建了一个随机森林分类器之后,我在一个只有5行的数据集中测试了模型。除了列AnnualFee之外,我保持所有变量不变。下面是我的测试数据集的快照:
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)我真的很感激在这方面的任何帮助!
发布于 2018-04-24 02:18:51
n_samples / (n_classes * np.bincount(y))的东西来进行加权,但是由于sklearn提供了类的自动平衡,所以您可能应该通过设置class_weights='balanced':http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html来使用它。发布于 2019-04-24 14:08:04
你可以直接执行单调性。sklearns RF似乎不支持这一点(https://stats.stackexchange.com/questions/383423/how-to-enforce-a-monotonic-answer-in-a-single-feature-in-a-binary-classification),但XGBoost (https://xgboost.readthedocs.io/en/latest/tutorials/monotonic.html)和其他一些人支持。
当然,一般说来,改进模型是很好的(请参阅Carlo的初步回答);而且,你对单调性的直觉可能在现实中并不成立。
https://datascience.stackexchange.com/questions/30704
复制相似问题