необычно высокая точность при беге ML - PullRequest
0 голосов
/ 16 ноября 2018

Привет! Я работаю со сложным набором данных, так как корреляция между входом и выходом низкая, но результаты очень хорошие (точность теста 99,9%). Я уверен, что делаю что-то не так, просто не знаю что.

метка является столбцом 'unsafe', который равен 0 или 1 (изначально был 0 или 100, но я ограничил максимальное значение - это не имело значения для результата. Я начал со случайных лесов, а затем запустил k ближайших соседей и получил почти с такой же точностью, 99,9%. Скриншоты df:

enter image description here enter image description here

есть намного больше 0, чем 1 (в обучении из 80 000 есть только 169 1, и в конце также есть цикл 1, но это просто, как был импортирован исходный файл)

import os
import glob

import numpy as np
import pandas as pd
import sklearn as sklearn
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_pickle('/Users/shellyganga/Downloads/ola.pickle')

maxVal = 1
df.unsafe = df['unsafe'].where(df['unsafe'] <= maxVal, maxVal)

print(df.head)

df.drop(df.columns[0], axis=1, inplace=True)
df.drop(df.columns[-2], axis=1, inplace=True)

#setting features and labels
labels = np.array(df['unsafe'])
features= df.drop('unsafe', axis = 1)

# Saving feature names for later use
feature_list = list(features.columns)

# Convert to numpy array
features = np.array(features)

from sklearn.model_selection import train_test_split

# 30% examples in test data
train, test, train_labels, test_labels = train_test_split(features, labels,
                                                          stratify = labels,
                                                          test_size = 0.3,
                                                          random_state = 0)

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier()
knn.fit(train, train_labels)

print(np.mean(train_labels))
print(train_labels.shape)

print('accuracy on train: {:.5f}'.format(knn.score(train, train_labels)))
print('accuracy on test: {:.5f}'.format(knn.score(test, test_labels)))
1015 * * Выход:
0.0023654350798950337
(81169,)
accuracy on train: 0.99763
accuracy on test: 0.99761

1 Ответ

0 голосов
/ 16 ноября 2018

Тот факт, что у вас гораздо больше экземпляров от 0 до 1, является примером дисбаланса класса . Вот действительно крутой вопрос stats.stackexchange по теме.

По сути, если только 169 из ваших 80000 меток равны 1, а остальные 0, то ваша модель может наивно предсказатьпометьте 0 для каждого экземпляра, и при этом точность обучающей установки (= доля ошибочно классифицированных экземпляров) все еще составляет 99,78875%.

Я предлагаю попробовать показатель F1, который является средним гармоническимточность, положительное прогнозирующее значение AKA = TP / (TP + FP), и отзыв, чувствительность AKA = TP / (TP + FN): https://scikit -learn.org / stable / modules / generate / sklearn.metrics.f1_score.html # sklearn.metrics.f1_score

from sklearn.metrics import f1_score
print('F1 score on train: {:.5f}'.format(f1_score(train, train_labels)))
print('F1 score on test:  {:.5f}'.format(f1_score(test, test_labels)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...