我使用极限学习机进行分类,发现我的分类准确率只有 70+%,这导致我通过创建更多分类模型来使用集成方法,并且测试数据将根据大多数模型的分类进行分类分类。然而,这种方法只能小幅提高分类精度。请问还有哪些其他方法可以用来提高二维线性不可分数据集的分类精度?
你的问题非常广泛......如果不知道你正在治疗的真正问题,就没有办法正确地帮助你。但是,一般来说,一些提高分类精度的方法是:
1 - 交叉验证:将训练数据集分组,始终分隔一组进行预测,并在每次执行中更改组。然后你就会知道哪些数据更好来训练更准确的模型。
2 - 交叉数据集:与交叉验证相同,但使用不同的数据集。
3 - 调整你的模型:它基本上改变了你用来训练分类模型的参数(不知道你正在使用哪种分类算法,所以很难提供更多帮助)。
4 - 改进或使用(如果您不使用)标准化过程:发现哪些技术(更改几何形状、颜色等)将为您提供更简洁的数据以供您在训练中使用。
5 - 更多地了解您正在处理的问题...尝试实施其他方法来解决相同的问题。总是至少有不止一种方法可以解决同一问题。您可能没有使用最好的方法。
提高模型性能有时可能具有挑战性。我相信,如果你们发现自己陷入类似的境地,很多人都会同意我的观点。你尝试你学到的所有策略和算法。然而,您未能提高模型的准确性。你感到无助和被困。而且,这就是 90% 的数据科学家放弃的地方。现在让我们深入挖掘一下。现在我们将检查提高模型准确性的行之有效的方法:
如果您觉得缺乏信息,那么您应该学习此链接,希望可以有所帮助:https://www.analyticsvidhya.com/blog/2015/12/improve-machine-learning-results/ 如果我提供的信息不太令人满意,很抱歉
XGboost 和 ensembles 是当前表格数据最先进的。尽管如此,进行模型选择和超参数优化 (HPO) 可以改善您的结果。最好使用嵌套交叉验证循环自动执行此搜索,并让它运行几天,同时从您身边寻找其他解决方案。
这是一个简单的代码来做到这一点
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# Create a simple binary classification dataset
X, y = make_classification(n_samples=500, n_features=20, n_informative=10, n_redundant=10, random_state=42)
# Define classifiers and their hyperparameter grids
models_and_parameters = {
'RandomForest': {
'model': RandomForestClassifier(),
'params': {
'model__n_estimators': [10, 50, 100],
'model__max_depth': [None, 10, 20]
}
},
'GradientBoosting': {
'model': GradientBoostingClassifier(),
'params': {
'model__n_estimators': [50, 100],
'model__learning_rate': [0.01, 0.1]
}
},
'SVC': {
'model': Pipeline([
('scaler', StandardScaler()),
('model', SVC())
]),
'params': {
'model__model__C': [0.1, 1, 10],
'model__model__kernel': ['linear', 'rbf']
}
}
}
# Define the outer cross-validation procedure
outer_cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# Store results
results = {}
# Perform nested cross-validation for each model
for name, mp in models_and_parameters.items():
model = mp['model']
param_grid = mp['params']
# Define the inner cross-validation procedure
inner_cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
# Set up the GridSearchCV for hyperparameter tuning
search = GridSearchCV(estimator=model, param_grid=param_grid, cv=inner_cv, scoring='accuracy')
# Perform nested cross-validation and store the results
cv_results = cross_val_score(search, X, y, cv=outer_cv, scoring='accuracy')
results[name] = cv_results
print(f"{name} accuracy: {np.mean(cv_results):.3f} ± {np.std(cv_results):.3f}")
# Output results
print("Nested CV results:")
for model_name, accuracies in results.items():
print(f"{model_name}: {np.mean(accuracies):.3f} ± {np.std(accuracies):.3f}")
但是,该方法仅将分类准确率提高了很小 保证金。
确实,使用 HPO 进行模型选择几乎没有改善结果。 下面是使用 HPO 进行模型选择时 F1 分数预期改进的示例。实验在 99 个数据集上完成
估算器 | 独特贡献 | 胜利 |
---|---|---|
额外树 | 0 | 0 |
HistGradientBoosting | 0 | 0 |
随机森林 | 0.00002 | 1 |
装袋 | 0.00004 | 2 |
梯度提升 | 0.00006 | 2 |
决策树 | 0.00020 | 10 |
额外的树 | 0.00041 | 9 |
PDC | 0.01312 | 75 |
首先,我们注意到 ExtraTree 和 HistGradientBoosting 不会提高 F1 分数,因为其他估计器会获得相同或更好的分数。
还有哪些其他方法可以用来改进分类 准确度
成对差分学习(PDC)是最有前途的算法,具有不同的方法和独特的贡献。它可以提高 99 个数据集中 75 个数据集的分数。
我建议从底部列表开始搜索,因为这些解决方案以其独特的贡献更有可能超越当前的解决方案。