sklearn功能不会影响准确性

时间:2018-05-08 17:00:46

标签: python pandas machine-learning scikit-learn supervised-learning

我最近使用sklearn分为机器学习。在使用了一些数据之后,我注意到无论是否删除或添加功能,准确度都没有改变(它仍然存在,0.66668208448967)。换句话说

geom_bar

此代码打印stat = "count"

为了更好地说明我的观点,我在我的CSV文件中添加了一个完全由0组成的列(我将列命名为library(tidyverse) var <- c(0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0) ggplot(data.frame(var), aes(x = "", fill = factor(var))) + geom_bar(position = "stack") )。改变之后  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我最终得到了这段代码。

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()) 但我无法理解原因。有谁知道问题是什么?

非常感谢您的帮助。

这是csv文件的一小部分。

0.66668208448967

当我打印(data.dtypes)时,我得到以下内容:

x

当我打印(data.describe())时,我得到以下内容:

y

1 个答案:

答案 0 :(得分:1)

你的问题在于你的正确&#34;柱。您提供字符串(&#34;是&#34;和&#34; no&#34;),其中包含数字。

例如,替换所有&#34;是&#34; 1和所有&#34; no&#34;用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"]]并注意区别!

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

使用我提供的数据样本,如果我们使用&#34; x&#34;我会看到它会产生影响。和&#34; y&#34;列或&#34;零&#34;柱。在第一种情况下,我们获得超过72%的分数。如果我们只使用无意义的&#34;零&#34;,由于数据集的类分布,我们得到66%。