我有一个不平衡的数据集,其中正类是大约10,000个条目,负类是大约8,00,000个条目。我正在尝试一个简单的scikit的LogisticRegression模型作为基线模型,class_weight ='balanced'(希望不平衡的问题应该解决?)。
然而,我的准确度得分为0.83,但精确度得分为0.03。可能是什么问题?我是否需要单独处理不平衡部件?
这是我目前的代码:
>>> train = []
>>> target = []
>>> len(posList)
... 10214
>>> len(negList)
... 831134
>>> for entry in posList:
... train.append(entry)
... target.append(1)
...
>>> for entry in negList:
... train.append(entry)
... target.append(-1)
...
>>> train = np.array(train)
>>> target = np.array(target)
>>>
>>> X_train, X_test, y_train, y_test = train_test_split(train, target, test_size=0.3, random_state=42)
>>>
>>> model = LogisticRegression(class_weight='balanced')
>>> model.fit(X_train, y_train)
LogisticRegression(C=1.0, class_weight='balanced', dual=False,
fit_intercept=True, intercept_scaling=1, max_iter=100,
multi_class='ovr', n_jobs=1, penalty='l2', random_state=None,
solver='liblinear', tol=0.0001, verbose=0, warm_start=False)
>>>
>>> predicted = model.predict(X_test)
>>>
>>> metrics.accuracy_score(y_test, predicted)
0.835596671213
>>>
>>> metrics.precision_score(y_test, predicted, average='weighted')
/usr/local/lib/python2.7/dist-packages/sklearn/metrics/classification.py:976: DeprecationWarning: From version 0.18, binary input will not be handled specially when using averaged precision/recall/F-score. Please use average='binary' to report only the positive class performance.
'positive class performance.', DeprecationWarning)
0.033512518766
答案 0 :(得分:0)
我想我明白发生了什么。
考虑一个虚拟分类器,它将返回数据集的每个样本的多数类。对于像你这样的不平衡集合似乎很公平(让我们称你的正面课程为 1级而负面的 0级)。分类器的准确度为:831134/(831134+10214.0) = 0.987859958067292
。是的,准确率为99%,但它不能很好地表示您的分类器。相反,我们最好看看它的精度。因此,由于您的数据实际上是不平衡的(比率1:80
),Logistic回归的表现很差,但对于虚拟分类器,它具有很高的准确性。
精确度定义为真阳性与真阳性和误报之和的比率。换句话说,所有被检测为属于第1类的元素中,元素真正属于第1类的比例。
LinearRegression分类器的准确度为acc = 0.835596671213
。因此,它们是虚拟分类器与逻辑回归之间的精确度差异:diff = 0.987859958067292 - 0.835596671213 = 0.15226328685429202
。因此, 15%的数据被虚拟分类器错误分类,这对应于几乎n_misclass = 0.15*(831134+10214.0)=126202.2
个样本。因此,Logistic回归将 126202 样本分类为 class 1 ,而它们仅 10214 。
Logistic回归的精度可能类似于:prec = 10214/126202.0 = 0.081
。
在你的情况下,它似乎在准确性方面表现不如我们上面所见。但这大致是为了让您了解可能发生的事情。