【问题标题】:How to back check classification using sklearn如何使用 sklearn 对分类进行反向检查
【发布时间】:2016-12-20 23:56:56
【问题描述】:

我在我的数据逻辑回归和朴素贝叶斯上运行两种不同的分类算法,但即使我改变了训练和测试数据的比率,它也给了我相同的准确性。以下是我正在使用的代码

import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB


df = pd.read_csv('Speed Dating.csv', encoding = 'latin-1')

X = pd.DataFrame()
X['d_age'] = df ['d_age']
X['match'] = df ['match']
X['importance_same_religion'] = df ['importance_same_religion']
X['importance_same_race'] = df ['importance_same_race']
X['diff_partner_rating'] = df ['diff_partner_rating']

# Drop NAs
X = X.dropna(axis=0)
# Categorical variable Match [Yes, No]
y = X['match']
# Drop y from X
X = X.drop(['match'], axis=1)

# Transformation
scalar = StandardScaler()
X = scalar.fit_transform(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Logistic Regression
model = LogisticRegression(penalty='l2', C=1)
model.fit(X_train, y_train)
print('Accuracy Score with Logistic Regression: ', accuracy_score(y_test, model.predict(X_test)))

#Naive Bayes
model_2 = GaussianNB()
model_2.fit(X_train, y_train)
print('Accuracy Score with Naive Bayes: ', accuracy_score(y_test, model_2.predict(X_test)))
print(model_2.predict(X_test))

有没有可能每次精度都一样?

【问题讨论】:

  • 是因为您的输入,Xnumpy array 和目标,ypandas series 对象,同时调用 train_test_split 类型不匹配不会影响模型的准确性?您可以使用y.valuesy 转换为数组并检查是否确实存在问题。
  • 这是一个问题,但我已经通过将所有内容转换为数据框来解决它,但我仍然获得了类似的准确性。事实上,我发现例如准确率为 80%,因为 80% 的测试数据包含零,所以实际上模型根本不起作用。

标签: python scikit-learn classification logistic-regression naivebayes


【解决方案1】:

如果类频率不平衡,这是常见的现象,例如几乎所有样本都属于一类。例如,如果 80% 的样本属于“否”类,那么分类器通常会倾向于预测“否”,因为这种微不足道的预测在您的训练集上达到了最高的整体准确度。

一般来说,在评估二元分类器的性能时,不应只看整体准确率。您必须考虑其他指标,例如 ROC 曲线、类准确度、f1 分数等。

在您的情况下,您可以使用 sklearns classification report 更好地了解您的分类器实际学习的内容:

from sklearn.metrics import classification_report

print(classification_report(y_test, model_1.predict(X_test)))
print(classification_report(y_test, model_2.predict(X_test)))

它将打印每个类的精度、召回率和准确率。

关于如何在您的班级“是”上达到更好的分类准确度,有三个选项

  • 使用样本权重,可以提高“是”类样本的重要性,从而迫使分类器更频繁地预测“是”
  • 对原始 X 中的“No”类进行下采样,以达到更平衡的类频率
  • 对原始 X 中的“Yes”类进行上采样,以达到更平衡的类频率

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 2016-10-27
    • 2018-02-19
    • 2015-11-20
    • 1970-01-01
    • 2016-05-09
    • 2015-06-19
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多