提高二元分类器的精度 - Python 中的决策树

数据挖掘 机器学习 Python scikit-学习 决策树 表现
2022-02-23 14:42:43

目前,我正在做一个项目。数据集大致以 50:50 的比例平衡。我创建了一个决策树分类器。我在验证数据上实现了不错的准确度(~75%),但目标变量的准确度存在偏差。对于 class=0,它大约是。98%,而对于 class = 1,只有 17%。

我尝试使用 MinMaxScaler 缩放数据仍然没有运气。

model = tree.DecisionTreeClassifier(class_weight={1:30}, min_samples_leaf=160, max_depth=10)

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=10)

min_max_scaler = preprocessing.MinMaxScaler()
X_train_scaled = min_max_scaler.fit_transform(X_train)
X_test_scaled = min_max_scaler.fit_transform(X_test)

model = model.fit(X_train_scaled, y_train)

prediction = model.predict(X_test_scaled)

print metrics.accuracy_score(y_test, prediction)
print classification_report(y_test, prediction)
Size of x_train_scaled = 12600 and x_test_scaled = 5400
Accuracy: 75%
Precision: {0:100%, 1:17%}
Recall: {0:74%, 1:100%}
F1-Score: {0:85%, 1:29%}

如何在保持整体精度和准确度的同时提高 class=1 的精度?

2个回答

我猜想 0 类和 1 类之间的精度差异来自您使用的class_weight参数。1 类将受益于这种对 0 类的超重。您可以尝试使用此参数来重新平衡您在 0 类和 1 类中的结果。

另一个想法可能是利用概率输出和决策边界阈值。请记住,当调用方法.predict ()时,sklearn 决策树会将输出概率与阈值 0.5 进行比较。如果大于 0.5,则分配类别 1。相反,如果小于 0.5,则分配类别 0。您可以尝试在此阈值上播放,首先使用.predict_proba()[:, 1]然后测试不同阈值决策边界的结果。您可以进行如下操作:

model = clf.fit(df[features], df[label])
df["proba"] = model.predict_proba(df[features])[:,1]
threshold = 0.4 # You can play on this value (default is 0.5)
df["pred"] = df["proba"].apply(lambda el: 1.0 if el >= threshold else 0.0)

在调整概率阈值时,必须注意我们使用对训练数据的预测来做到这一点。如果我们根据对测试数据所做的预测调整阈值,我们将简单地过度拟合测试数据上的模型。