<p>我想人们对用什么重量做什么有很多困惑。我不确定我到底知道什么困扰着你,所以我要涵盖不同的主题,忍受我;)。</p>
<h2>类权重</h2>
<p>来自<code>class_weight</code>参数的权重用于训练分类器。
它们不用于计算您正在使用的任何度量:对于不同的类权重,数字将不同,因为分类器不同。</p>
<p>基本上,在每个scikit学习分类器中,类权重用于告诉模型类有多重要。这意味着,在训练过程中,分类器将付出额外的努力,对具有高权重的类进行适当的分类。<br/>
他们是如何做到这一点的是算法的具体情况。如果你想知道它是如何为SVC工作的,而doc对你来说没有意义,请尽管提一下。</p>
<h2>指标</h2>
<p>一旦你有了一个分类器,你就想知道它的性能如何。
在这里你可以使用你提到的指标:<code>accuracy</code>,<code>recall_score</code>,<code>f1_score</code>。。。</p>
<p>通常当类分布不平衡时,精确性被认为是一个很差的选择,因为它给只预测最频繁类的模型带来了高分。</p>
<p>我不会详细说明所有这些度量,但请注意,除了<code>accuracy</code>,它们自然应用于类级别:正如您在分类报告的<code>print</code>中看到的,它们是为每个类定义的。它们依赖于诸如<code>true positives</code>或<code>false negative</code>之类的概念,这些概念要求定义哪个类是<em>正的</em>类。</p>
<pre><code> precision recall f1-score support
0 0.65 1.00 0.79 17
1 0.57 0.75 0.65 16
2 0.33 0.06 0.10 17
avg / total 0.52 0.60 0.51 50
</code></pre>
<h2>警告</h2>
<pre><code>F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The
default `weighted` averaging is deprecated, and from version 0.18,
use of precision, recall or F-score with multiclass or multilabel data
or pos_label=None will result in an exception. Please set an explicit
value for `average`, one of (None, 'micro', 'macro', 'weighted',
'samples'). In cross validation use, for instance,
scoring="f1_weighted" instead of scoring="f1".
</code></pre>
<p>您收到此警告是因为您正在使用f1分数、召回率和精确度,而没有定义应如何计算这些分数、召回率和精确度!
问题可以重新表述:从上述分类报告中,如何为f1分数输出<strong>1</strong>全局数?
你可以:</p>
<ol>
<li>取每个类的f1分数的平均值:这就是上面的<code>avg / total</code>结果。它也被称为<em>宏</em>平均值。</li>
<li>使用真阳性/假阴性等的全局计数来计算f1分数(将每个类的真阳性/假阴性数相加)。Aka<em>micro</em>平均值。</li>
<li>计算f1分数的加权平均值。在scikit learn中使用<code>'weighted'</code>将通过类的支持来衡量f1分数:一个类拥有的元素越多,这个类的f1分数在计算中就越重要。</li>
</ol>
<p>这是scikit learn中的3个选项,警告是您必须选择其中一个。所以必须为score方法指定一个<code>average</code>参数。</p>
<p>你选择哪一个取决于你想如何衡量分类器的性能:例如宏平均不考虑类不平衡,类1的f1分数和类5的f1分数同样重要。但是如果你使用加权平均法,你会对第五课更重要。</p>
<p>这些度量标准中的整个参数规范在scikit learn中不是非常清楚,根据文档,它在0.18版中会变得更好。他们正在删除一些不明显的标准行为,并发出警告,以便开发人员注意到它。</p>
<h2>计算分数</h2>
<p>我最不想提的是(如果你知道的话,可以跳过它)分数只有在基于分类器从未见过的数据计算时才有意义。
这一点非常重要,因为在拟合分类器时使用的数据上得到的任何分数都是完全不相关的。</p>
<p>这里有一种使用<code>StratifiedShuffleSplit</code>的方法,它给您一个数据的随机分割(在洗牌之后),以保持标签分布。</p>
<pre><code>from sklearn.datasets import make_classification
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix
# We use a utility to generate artificial classification data.
X, y = make_classification(n_samples=100, n_informative=10, n_classes=3)
sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
for train_idx, test_idx in sss:
X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)
print(f1_score(y_test, y_pred, average="macro"))
print(precision_score(y_test, y_pred, average="macro"))
print(recall_score(y_test, y_pred, average="macro"))
</code></pre>
<p>希望这有帮助。</p>