首页 > 解决方案 > sklearn 功能不影响准确性

问题描述

我最近使用 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

在这一点上,我假设它仍在使用超过两列xy尽管我不明白为什么。有谁知道是什么问题?

非常感谢您的帮助。

这是 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

当我 print(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  

标签: pythonpandasmachine-learningscikit-learnsupervised-learning

解决方案


您的问题在于您的“正确”列。您在需要数字的地方提供字符串(“yes”和“no”)。

例如,将所有“是”替换为 1,将所有“否”替换为 0,然后重试。

请参阅以下最小示例:

测试.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"]]注意区别!

从您的数据统计中,我们可以了解到您的数据集中的 477 个样本中有 318 个属于 0(或“否”)组。这些是 2/3 或0.666... 因此,如果您的模型无法从提供的特征中学到任何东西,它将始终输出零(因为所有系数都为零)。因此,对于任何输入,预测类别将为 0(或“否”)。这就是为什么你总是得到相同的分数:模型总是预测 0 和 2/3 的数据属于零类,所以你的模型在 66% 的情况下是正确的。

通过我提供的数据样本,您会发现,如果我们使用“x”和“y”列或“zeros”列,它确实会产生影响。在第一种情况下,我们得到了超过 72% 的分数。如果我们只使用无意义的“零”,我们得到 66%,因为我们数据集的类分布。


推荐阅读