gpt4 book ai didi

python - 在 sklearn cross_val_score 上评估多个分数

转载 作者:IT老高 更新时间:2023-10-28 22:18:20 44 4
gpt4 key购买 nike

我正在尝试使用 sklearn 评估多个机器学习算法的几个指标(准确度、召回率、精度等)。

对于我从文档 here 中了解的内容从源代码(我使用的是 sklearn 0.17),cross_val_score函数每次执行只接收一个记分员。所以为了计算多个分数,我必须:

  1. 多次执行
  2. 实现我的(耗时且容易出错的)记分器

    我已经用这段代码执行了多次:

    from sklearn.svm import SVC
    from sklearn.naive_bayes import GaussianNB
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.cross_validation import cross_val_score
    import time
    from sklearn.datasets import load_iris

    iris = load_iris()

    models = [GaussianNB(), DecisionTreeClassifier(), SVC()]
    names = ["Naive Bayes", "Decision Tree", "SVM"]
    for model, name in zip(models, names):
    print name
    start = time.time()
    for score in ["accuracy", "precision", "recall"]:
    print score,
    print " : ",
    print cross_val_score(model, iris.data, iris.target,scoring=score, cv=10).mean()
    print time.time() - start

我得到这个输出:

Naive Bayes
accuracy : 0.953333333333
precision : 0.962698412698
recall : 0.953333333333
0.0383198261261
Decision Tree
accuracy : 0.953333333333
precision : 0.958888888889
recall : 0.953333333333
0.0494720935822
SVM
accuracy : 0.98
precision : 0.983333333333
recall : 0.98
0.063080072403

这没关系,但我自己的数据很慢。如何衡量所有分数?

最佳答案

自从写这篇文章 scikit-learn 已经更新并且我的答案已经过时了,请看下面更简洁的解决方案


您可以编写自己的评分函数来捕获所有三个信息,但是用于交叉验证的评分函数只能在 scikit-learn 中返回一个数字(这可能用于兼容性原因)。下面是一个示例,其中每个交叉验证切片的每个分数都打印到控制台,返回值只是三个指标的总和。如果要返回所有这些值,则必须对 cross_val_score(cross_validation.py 的第 1351 行)和 _score(第 1601 行或同一个文件)。

from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import cross_val_score
import time
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score, precision_score, recall_score

iris = load_iris()

models = [GaussianNB(), DecisionTreeClassifier(), SVC()]
names = ["Naive Bayes", "Decision Tree", "SVM"]

def getScores(estimator, x, y):
yPred = estimator.predict(x)
return (accuracy_score(y, yPred),
precision_score(y, yPred, pos_label=3, average='macro'),
recall_score(y, yPred, pos_label=3, average='macro'))

def my_scorer(estimator, x, y):
a, p, r = getScores(estimator, x, y)
print a, p, r
return a+p+r

for model, name in zip(models, names):
print name
start = time.time()
m = cross_val_score(model, iris.data, iris.target,scoring=my_scorer, cv=10).mean()
print '\nSum:',m, '\n\n'
print 'time', time.time() - start, '\n\n'

给出:

Naive Bayes
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
0.866666666667 0.904761904762 0.866666666667
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0

Sum: 2.86936507937


time 0.0249638557434


Decision Tree
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
0.866666666667 0.866666666667 0.866666666667
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
1.0 1.0 1.0

Sum: 2.86555555556


time 0.0237860679626


SVM
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0

Sum: 2.94333333333


time 0.043044090271

从 scikit-learn 0.19.0 开始,解决方案变得更加更容易

from sklearn.model_selection import cross_validate
from sklearn.datasets import load_iris
from sklearn.svm import SVC

iris = load_iris()
clf = SVC()
scoring = {'acc': 'accuracy',
'prec_macro': 'precision_macro',
'rec_micro': 'recall_macro'}
scores = cross_validate(clf, iris.data, iris.target, scoring=scoring,
cv=5, return_train_score=True)
print(scores.keys())
print(scores['test_acc'])

这给出了:

['test_acc', 'score_time', 'train_acc', 'fit_time', 'test_rec_micro', 'train_rec_micro', 'train_prec_macro', 'test_prec_macro']
[ 0.96666667 1. 0.96666667 0.96666667 1. ]

关于python - 在 sklearn cross_val_score 上评估多个分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35876508/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com