猿问

如何有效地比较所有模型的准确性

我已经拆分了训练数据并初始化了 11 个分类器模型,我现在想比较这些模型。


我在 Ubuntu 18.04 上运行 VS Code。


我试过了:


# Prepare lists

models = [ran, knn, log, xgb, gbc, svc, ext, ada, gnb, gpc, bag]         

scores = []


# Sequentially fit and cross validate all models

for mod in models:

    mod.fit(X_train, y_train)

    acc = cross_val_score(mod, X_train, y_train, scoring = 

    "accuracy", cv = 10)

scores.append(acc.mean())


# Creating a table of results, ranked highest to lowest

results = pd.DataFrame({

    'Model': ['Random Forest', 'K Nearest Neighbour', 'Logistic 

     Regression', 'XGBoost', 'Gradient Boosting', 'SVC', 'Extra 

     Trees', 'AdaBoost', 'Gaussian Naive Bayes', 'Gaussian Process', 

     'Bagging Classifier'],

     'Score': scores})

最后一部分返回:


ValueError:数组的长度必须相同


我数了 2 倍,确实有 11 个模型。


我错过了什么?


叮当猫咪
浏览 267回答 2
2回答

月关宝盒

已经对上一个答案投了赞成票,我继续证明该错误确实是由于您score.append()在for循环之外:我们实际上不需要拟合任何模型;我们可以通过对您的代码进行以下修改来模拟这种情况,这不会改变问题的本质:import numpy as npimport pandas as pdmodels = ['ran', 'knn', 'log', 'xgb', 'gbc', 'svc', 'ext', 'ada', 'gnb', 'gpc', 'bag']         scores = []cv=10# Sequentially fit and cross validate all modelsfor mod in models:    acc = np.array([np.random.rand() for i in range(cv)]) # simulate your accuracy herescores.append(acc.mean()) # as in your code, i.e outside the for loop# Create a dataframe of resultsresults = pd.DataFrame({    'Model': ['Random Forest', 'K Nearest Neighbour', 'Logistic Regression', 'XGBoost', 'Gradient Boosting',      'SVC', 'Extra Trees', 'AdaBoost', 'Gaussian Naive Bayes', 'Gaussian Process', 'Bagging Classifier'],    'Score': scores})不出所料,这基本上复制了您的错误:ValueError: arrays must all be same length因为,正如在另一个答案中已经讨论过的,您的scores列表只有一个元素,即acc.mean()仅来自循环的最后一次迭代:len(scores)# 1scores# [0.47317491043203785]因此大熊猫抱怨,因为它无法填充 11 行数据框......正如其他答案中已经建议的那样,scores.append()在for循环内移动可以解决问题:for mod in models:    acc = np.array([np.random.rand() for i in range(cv)])    scores.append(acc.mean()) # moved inside the loop# Create a dataframe of resultsresults = pd.DataFrame({    'Model': ['Random Forest', 'K Nearest Neighbour', 'Logistic Regression', 'XGBoost', 'Gradient Boosting',      'SVC', 'Extra Trees', 'AdaBoost', 'Gaussian Naive Bayes', 'Gaussian Process', 'Bagging Classifier'],    'Score': scores})print(results)# output:                   Model     Score0          Random Forest  0.4923641    K Nearest Neighbour  0.6240682    Logistic Regression  0.6136533                XGBoost  0.5364884      Gradient Boosting  0.4841955                    SVC  0.3815566            Extra Trees  0.2749227               AdaBoost  0.5092978   Gaussian Naive Bayes  0.3628669       Gaussian Process  0.60653810    Bagging Classifier  0.393950您可能还想记住,您不需要model.fit()代码中的部分 -cross_val_score所有必要的拟合本身...

长风秋雁

您的代码中似乎存在缩进错误,请参阅下面已编辑的代码。在你的代码中,如果你这样做,len(scores)你会得到,1因为只有最后一个值被添加,因为 append 在循环外被调用。# Prepare listsmodels = [ran, knn, log, xgb, gbc, svc, ext, ada, gnb, gpc, bag]         scores = []# Sequentially fit and cross validate all modelsfor mod in models:    mod.fit(X_train, y_train)    acc = cross_val_score(mod, X_train, y_train, scoring =     "accuracy", cv = 10)    scores.append(acc.mean())
随时随地看视频慕课网APP

相关分类

Python
我要回答