如何使用随机森林对不平衡类进行分类以避免过度拟合
Posted
技术标签:
【中文标题】如何使用随机森林对不平衡类进行分类以避免过度拟合【英文标题】:How to Classify unbalanced classes with Random Forest avoiding overfitting 【发布时间】:2017-01-09 17:36:11 【问题描述】:我陷入了数据科学问题。 我正在尝试使用随机森林预测一些未来的课程。 我的特征是分类的和数字的。 我的课程不平衡。 当我进行拟合时,分数看起来非常好,但交叉验证很糟糕。 我的模型必须过拟合。
这是我的代码:
features_cat = ["area", "country", "id", "company", "unit"]
features_num = ["year", "week"]
classes = ["type"]
print("Data",len(data_forest))
print(data_forest["type"].value_counts(normalize=True))
X_cat = pd.get_dummies(data_forest[features_cat])
print("Cat features dummies",len(X_cat))
X_num = data_forest[features_num]
X = pd.concat([X_cat,X_num],axis=1)
X.index = range(1,len(X) + 1)
y = data_forest[classes].values.ravel()
test_size = 0.2
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=42)
forest = RandomForestClassifier(n_estimators=50, n_jobs=4, oob_score=True, max_features="log2", criterion="entropy")
forest.fit(X_train, y_train)
score = forest.score(X_test, y_test)
print("Score on Random Test Sample:",score)
X_BC = X[y!="A"]
y_BC = y[y!="A"]
score = forest.score(X_BC, y_BC)
print("Score on only Bs, Cs rows of all dataset:",score)
这是输出:
Data 768296
A 0.845970
B 0.098916
C 0.055114
Name: type, dtype: float64
Cat features dummies 725
Score on Random Test Sample: 0.961434335546
Score on only Bs, Cs rows of all dataset: 0.959194193052
到目前为止,我对该模型感到满意... 但是当我尝试预测未来的日期时,它给出的结果基本相同。
我检查交叉验证:
rf = RandomForestClassifier(n_estimators=50, n_jobs=4, oob_score=True, max_features="log2", criterion="entropy")
scores = cross_validation.cross_val_score(rf, X, y, cv=5, n_jobs=4)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
它给我的结果很差......
Accuracy: 0.55 (+/- 0.57)
我错过了什么?
【问题讨论】:
你的类标签分布是什么? 【参考方案1】:如果您更改(或删除)random_state
会怎样? train_test_split
默认情况下不分层,因此可能是您的分类器始终只预测最常见的类 A
,而您与该分区的测试拆分仅包含 A
的。
【讨论】:
以上是关于如何使用随机森林对不平衡类进行分类以避免过度拟合的主要内容,如果未能解决你的问题,请参考以下文章
Spark Random Forest classifier 随机森林分类