Sklearn Особенности не влияют на точность - PullRequest
0 голосов
/ 08 мая 2018

Я недавно разделился на машинное обучение с использованием sklearn. После использования его с некоторыми данными, я заметил, что независимо от того, удаляю я или добавляю функции, точность не меняется (она равна 0.66668208448967). другими словами

import pandas as pd
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.model_selection import cross_val_score


scores = []
data = pd.read_csv('/Users/fozoro/Downloads/test.csv')

X = data[["x","y"]]
y = data[["correct"]]

knn = LogisticRegression()
knn.fit(X,y.values.ravel())

scores = cross_val_score(knn, X, y.values.ravel(), cv = 10, scoring = "accuracy")

print(scores.mean())

Этот код печатает 0.66668208448967

, чтобы лучше проиллюстрировать мою точку зрения, я добавил в мой CSV-файл столбец, который полностью состоит из 0 (я назвал столбец zeros). после смены X = data[["x","y"]] до X = data[["zeros"]] Я получаю этот код.

import pandas as pd
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.model_selection import cross_val_score


scores = []
data = pd.read_csv('/Users/fozoro/Downloads/HQ_Questions_Rest_new_test.csv')

X = data[["zeros"]]
y = data[["correct"]]

knn = LogisticRegression()
knn.fit(X,y.values.ravel())

scores = cross_val_score(knn, X, y.values.ravel(), cv = 10, scoring = "accuracy")

print(scores.mean())

и он все еще печатает тот же счет 0.66668208448967.

На данный момент, я предполагаю, что он все еще использует более двух столбцов x и y, хотя я не понимаю, почему. Кто-нибудь знает в чем проблема?

Заранее большое спасибо за помощь.

Это небольшая часть файла CSV.

0   44600  yes
12  41700  no
574 14500  no

Когда я печатаю (data.dtypes), я получаю следующее:

Q + ans                    int64
Q + ans broken search      int64
Bing total Search          int64
mean1                    float64
mean2                    float64
zeros                      int64
correct                    int64
dtype: object

Когда я печатаю (data.describe ()), я получаю следующее:

          Q + ans  Q + ans broken search  Bing total Search       mean1  \
count  477.000000             477.000000       4.770000e+02  477.000000   
mean     3.972746              30.408805       3.661450e+06    3.972746   
std     12.112970             133.128478       1.555090e+07    7.292793   
min      0.000000               0.000000       0.000000e+00    0.000000   
25%      0.000000               0.000000       8.110000e+04    0.000000   
50%      0.000000               0.000000       3.790000e+05    1.333333   
75%      2.000000               4.000000       2.000000e+06    5.333333   
max    162.000000            1908.000000       2.320000e+08   60.666667   

                mean2  zeros     correct  
    count  477.000000  477.0  477.000000  
    mean    30.272537    0.0    0.333333  
    std     76.365587    0.0    0.471899  
    min      0.000000    0.0    0.000000  
    25%      0.000000    0.0    0.000000  
    50%      1.666667    0.0    0.000000  
    75%     21.000000    0.0    1.000000  
    max    636.666667    0.0    1.000000  

1 Ответ

0 голосов
/ 08 мая 2018

Ваша проблема заключается в вашем "правильном" столбце. Вы предоставляете строки («да» и «нет»), где ожидаются числа.

Например, замените все «да» на 1, а все «нет» на 0 и повторите попытку.

См. Следующий минимальный пример:

test.csv:

x,y,correct,zeros
1,1,1.0,0
2,2,0.0, 0
1,2,0.0,0
3,1,1.0,0
3,1,1.0,0
4,2,0.0, 0
5,2,0.0,0
6,1,1.0,0
7,1,1.0,0
8,2,0.0, 0
9,2,0.0,0
10,1,1.0,0
11,1,1.0,0
12,1,1.0,0
13,1,1.0,0
14,1,1.0,0
15,1,1.0,0
16,1,1.0,0

Содержимое файла python:

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
data = pd.read_csv("./test.csv")
X = data[["x","y"]]
y = data[["correct"]]
knn = LogisticRegression()
scores = cross_val_score(knn, X, y.values.ravel(), cv=3, scoring="accuracy")
scores.mean()

Попробуйте заменить строку X = data[["x","y"]] с X = data[["zeros"]] и обратите внимание на разницу!

Из статистики ваших данных мы можем узнать, что 318 из 477 выборок в вашем наборе данных относятся к группе 0 (или «нет»). Это 2/3 или 0.666... Поэтому, если ваша модель не может извлечь что-либо из предоставленных функций, она всегда будет выводить ноль (так как все коэффициенты равны нулю). Следовательно, для любого ввода прогнозируемый класс будет равен 0 (или «нет»). Вот почему вы всегда получаете один и тот же балл: модель всегда предсказывает, что 0 и 2/3 ваших данных принадлежат нулевому классу, поэтому ваша модель в 66% случаев правильная.

Используя мои предоставленные образцы данных, вы видите, что они ДЕЙСТВИТЕЛЬНО имеют значение, если мы используем столбцы «x» и «y» или столбец «нули». В первом случае мы получаем оценку более 72%. Если мы просто используем бессмысленные «нули», мы получаем 66% из-за распределения классов нашего набора данных.

...