改进和调整这些模型的好方法 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_cleandf_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 :自适应地调整卷积参数

神经网络模型遇到瓶颈?这些Tricks让你相见恨晚!

预测模型基于遗传算法改进核极限学习机(KELM)分类算法 matlab源码

预测模型基于麻雀算法改进核极限学习机(KELM)分类算法 matlab源码

预测模型基于遗传算法改进核极限学习机(KELM)分类算法 matlab源码

预测模型基于麻雀算法改进核极限学习机(KELM)分类算法 matlab源码