Roc*_*etq 1 python machine-learning python-2.7 random-forest scikit-learn
我正在使用随机树算法进行二进制分类问题.训练集包含70k值为"0"类,仅3k为"1".另外,预测的结果X_test 应该给出相同的"0"和"1".
clf = RandomForestClassifier(random_state=1, n_estimators=350, min_samples_split=6, min_samples_leaf=2)
scores = cross_validation.cross_val_score(clf, x_train, y_train, cv=cv)
print("Accuracy (random forest): {}+/-{}".format(scores.mean(), scores.std()))
Run Code Online (Sandbox Code Playgroud)
准确度(随机森林):0.960755941369/1.40500919606e-06
clf.fit(x_train, y_train)
prediction_final = clf.predict(X_test) # this return Target values: 76k Zeroes and only 15 ones
#x_test is 10% of x_train set
preds_test = clf.predict(x_test)
print "precision_score", precision_score(y_test, preds_final)
print "recall_score", recall_score(y_test, preds_final)
Run Code Online (Sandbox Code Playgroud)
precision_score 0.0; recall_score 0.0
confusion_matrix [[7279 1] [322 0]]
到目前为止,我可以看到,存在过度拟合问题,但为什么不进行交叉验证检测呢?甚至标准偏差也很低.那么我该如何解决这个问题呢?
PS我试图用"0"和3k用"1"取3k行 - 作为训练集,模型要好得多,但这不是解决方案.
(总体而言)准确性对于像您这样的不平衡数据集几乎是无用的度量,因为它计算正确预测的百分比.在你的情况下,想象一个不会学到任何东西的分类器,但总是预测"0".由于您有70k零且只有3k,所以该分类器的准确度得分为70/73 = 95.9%.
检查混淆矩阵通常有助于披露这样的"分类器".
因此,您绝对应该使用另一种方法来量化分类质量.平均准确度是一种选择,因为它计算所有类别的平均准确度.在二进制分类的情况下,它也被称为平衡准确度并且导致计算(TP/P + TN/N)/2,使得上面想象的分类器(其总是预测"0")将仅得分(100% + 0%) / 2 = 50%.但是,这项措施似乎没有实施scikit-learn.虽然您可以自己实现这样的评分功能,但使用其他预定义评分者可能会更容易,更快捷.
例如,您可以通过传递来计算F1分数而不是精确度.F1得分考虑了精确度和召回率.scoring = 'f1'cross_validation.cross_val_score
| 归档时间: |
|
| 查看次数: |
514 次 |
| 最近记录: |