改进和调整这些模型的好方法 Sklearn
Posted
技术标签:
【中文标题】改进和调整这些模型的好方法 Sklearn【英文标题】:Fine way to improve and tuning these models Sklearn 【发布时间】:2021-12-29 08:02:50 【问题描述】:我正在构建一种算法来预测体育博彩的足球比赛。
我有一个从list
训练一些模型的函数,我会提高模型的准确性并尽可能准确地获得概率。
分类器列表
clf1 = LogisticRegression(multi_class='multinomial', random_state=1)
clf2 = GradientBoostingClassifier()
clf3 = MLPClassifier()
classifiers=[
MLPClassifier(),
VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='soft'),
AdaBoostClassifier(),
GradientBoostingClassifier(),
CalibratedClassifierCV(),
LinearDiscriminantAnalysis(),
LogisticRegression(),
LogisticRegressionCV(),
QuadraticDiscriminantAnalysis(),
]
代码
def proba_classifiers(df_clean, df_clean_pred, X, X_pred, y, classifier_list):
df_proba=[]
df_proba_pred=[]
for classifier in classifier_list:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.8, stratify=y)
classifier.fit(X_train, y_train)
p_train = classifier.predict(X_train)
acc_train = accuracy_score(y_train, p_train)
p_test = classifier.predict(X_test)
acc_test = accuracy_score(y_test, p_test)
print(f'Accuracy Train: ":.0%".format(acc_train), Accuracy Test: ":.0%".format(acc_test), Model: classifier.__class__.__name__ ')
proba = classifier.predict_proba(X)
proba_pred = classifier.predict_proba(X_pred)
proba = pd.DataFrame(proba, columns=['H','D','A'])
df_proba.append(proba)
proba_pred = pd.DataFrame(proba_pred, columns=['H','D','A'])
df_proba_pred.append(proba_pred)
df_proba = pd.concat(df_proba,axis=1)
#adjust iloc
df_clean = df_clean.iloc[:, :16]
df_proba = pd.concat([df_clean.reset_index(drop=True), df_proba], axis=1)
df_proba_pred = pd.concat(df_proba_pred,axis=1)
#adjust iloc
df_clean_pred = df_clean_pred.iloc[:, :16]
df_proba_pred = pd.concat([df_clean_pred.reset_index(drop=True), df_proba_pred], axis=1)
return df_proba, df_proba_pred
PS X_pred
是我要预测的 X。
模型得分
Accuracy Train: 48%, Accuracy Test: 48%, Model: MLPClassifier
Accuracy Train: 48%, Accuracy Test: 48%, Model: VotingClassifier
Accuracy Train: 48%, Accuracy Test: 48%, Model: AdaBoostClassifier
Accuracy Train: 50%, Accuracy Test: 48%, Model: GradientBoostingClassifier
Accuracy Train: 48%, Accuracy Test: 48%, Model: CalibratedClassifierCV
Accuracy Train: 48%, Accuracy Test: 48%, Model: LinearDiscriminantAnalysis
Accuracy Train: 48%, Accuracy Test: 48%, Model: LogisticRegression
Accuracy Train: 48%, Accuracy Test: 48%, Model: LogisticRegressionCV
Accuracy Train: 47%, Accuracy Test: 47%, Model: QuadraticDiscriminantAnalysis
【问题讨论】:
你在这里做的不一定是想“改进”一个模型。你正在做的是测试不同的模型,看看哪个是最好的算法。这样,您应该在每次迭代后拆分数据集。每个拆分都会有所不同,因此在比较算法时,您不会得到真正的“苹果对苹果”的比较。其次,有些事情似乎有点不对劲,因为您对所有内容都获得了相同的准确性。你能分享你的数据集吗? 我也对你输入函数的参数感到困惑。您只需要 X、y 和分类器列表 是的,所以为了比较模型,我必须将数据集拆分为每个拆分均等。我在train_test_split
函数中添加random_state
来解决这个问题,对吧?
这里是数据集filebin.net/6kw8mx26ywfqad6t
df_clean
和 df_clean_pred
是没有特征的原始数据集,其中我 concat
每个模型的概率。
【参考方案1】:
我想假设您想提高准确性,大多数情况下,如果您想提高准确性,您可能需要在 sklearn 中使用 GridSearch。这是一种调整模型(分类器)以提高准确性的方法,您可以通过下面的文档链接了解更多信息。 完成转动后,它会为您提供修复到分类器中的最佳参数。 例如,您有“clf1 = LogisticRegression(multi_class='multinomial', random_state=1)”
您将需要更多参数,例如我在下面的代码中定义的。
Sklearn documentation
但是,这里有一种进行逻辑回归超调谐的方法,但要搜索其他方法,例如 adaboost 和其他最佳参数:
# Hyperparameter tunning for logistic regression
logreg_grid = "C": np.logspace(-5, 5, 10),
"solver": ["liblinear","lbfgs"],
"tol":np.logspace(-5, 5, 10),
"max_iter":np.arange(100, 3000,80),
"class_weight": [None, 0:1, 0:1.5, 0:1, 1:2]
# setup grid hyperparameter search for logistic resgression
gs_logreg = GridSearchCV(LogisticRegression(),
param_grid=logreg_grid,
cv=5,
verbose=True)
# fit grid hyperparamter search model
gs_logreg.fit(Xtrain,ytrain)
完成后,您可以使用此代码获取参数并修复到您的分类器中:
gs_logreg.best_params_
然后将参数固定到您之前的方程中,前提是您已经完成了超调。
clf1 = LogisticRegression(C=2154.4346900318865, solver='rbf', tol=0.0037649358067924714, max_iter = "300", multi_class='multinomial', random_state=1)
【讨论】:
以上是关于改进和调整这些模型的好方法 Sklearn的主要内容,如果未能解决你的问题,请参考以下文章
改进YOLO系列 | Microsoft 团队 | Dynamic Convolution :自适应地调整卷积参数
预测模型基于遗传算法改进核极限学习机(KELM)分类算法 matlab源码
预测模型基于麻雀算法改进核极限学习机(KELM)分类算法 matlab源码