Как проверить классификацию с помощью sklearn
Я использую два разных алгоритма классификации для моей логистической регрессии данных и наивных байесов, но это дает мне ту же точность, даже если я изменяю соотношение данных обучения и тестирования. Ниже приведен код, который я использую
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))
Возможно ли, что каждый раз точность одинакова?
1 ответ
Это обычное явление, возникающее, если частоты классов не сбалансированы, например, почти все выборки принадлежат одному классу. Например, если 80% ваших выборок относятся к классу "Нет", то классификатор часто склонен прогнозировать "Нет", потому что такой тривиальный прогноз достигает наивысшей общей точности в вашем наборе поездов.
В целом, оценивая производительность двоичного классификатора, вы должны смотреть не только на общую точность. Вы должны учитывать другие показатели, такие как кривая ROC, точность классов, оценки f1 и так далее.
В вашем случае вы можете использовать отчет о классификации sklearns, чтобы лучше понять, что на самом деле изучает ваш классификатор:
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, чтобы достичь более сбалансированных частот класса
- Уточните класс "Да" в исходном X, чтобы достичь более сбалансированных частот класса.