我最近开始使用 sklearn 进行机器学习。在使用一些数据后,我注意到无论我删除还是添加特征,准确率都没有变化(一直停留在 0.66668208448967)。换句话说
这段代码会输出 0.66668208448967
为了更好地说明我的问题,我在 CSV 文件中添加了一列,全部是 0(我将这一列命名为 zeros
)。在将 X = data[["x","y"]]
更改为 X = data[["zeros"]]
后,我的代码变成了这样。
它仍然输出相同的分数 0.66668208448967
。
此时,我假设它仍然在使用另外两列 x
和 y
,但我不明白为什么。有人知道问题出在哪里吗?
非常感谢您的帮助。
这是 CSV 文件的一小部分。
0 44600 yes12 41700 no574 14500 no
当我打印 data.dtypes 时,我得到以下结果:
Q + ans int64Q + ans broken search int64Bing total Search int64mean1 float64mean2 float64zeros int64correct int64dtype: 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
回答:
您的问题在于“correct”这一列。您提供了字符串(“yes”和“no”),而期望的是数字。
例如,将所有“yes”替换为1,将所有“no”替换为0,然后再试一次。
请看以下最小示例:
test.csv:
x,y,correct,zeros1,1,1.0,02,2,0.0, 01,2,0.0,03,1,1.0,03,1,1.0,04,2,0.0, 05,2,0.0,06,1,1.0,07,1,1.0,08,2,0.0, 09,2,0.0,010,1,1.0,011,1,1.0,012,1,1.0,013,1,1.0,014,1,1.0,015,1,1.0,016,1,1.0,0
python 文件的内容:
尝试将 X = data[["x","y"]]
替换为 X = data[["zeros"]]
,并注意差异!
从您的数据统计中我们可以了解到,您的数据集中有 477 个样本中的 318 个属于 0(或“no”)组。这些是 2/3 或 0.666...
。因此,如果您的模型无法从提供的特征中学习任何东西,它将始终输出零(因为所有系数都是零)。因此,对于任何输入,预测的类别将是 0(或“no”)。这就是为什么您总是得到相同的分数:模型总是预测 0,而您的数据中有 2/3 属于零类,所以您的模型在 66% 的情况下是正确的。
使用我提供的数据样本,您会发现使用“x”和“y”列与使用“zeros”列确实有区别。在第一种情况下,我们得到超过 72% 的分数。如果我们只使用无意义的“zeros”,我们会得到 66%,因为数据集的类别分布。