sklearn 功能不影响准确性
sklearn Features don't affect accuracy
最近在用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
您的问题出在您的 "correct" 栏中。您在需要数字的位置提供字符串("yes" 和 "no")。
例如,将所有 "yes" 替换为 1,将所有 "no" 替换为 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(或"no")组。这些是 2/3 或 0.666...
因此,如果您的模型无法从提供的特征中学到任何东西,它将始终输出零(因为所有系数都为零)。因此,对于任何输入,预测的 class 将为 0(或 "no")。这就是为什么你总是得到相同的分数:模型总是预测 0 和 2/3 的数据属于零 class,所以你的模型在 66% 的情况下是正确的。
根据我提供的数据样本,您会发现如果我们使用 "x" 和 "y" 列或 "zeros" 列,它确实会产生影响。在第一种情况下,我们得到超过 72% 的分数。如果我们只使用无意义的 "zeros",我们得到 66%,因为我们数据集的 class 分布。
最近在用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
您的问题出在您的 "correct" 栏中。您在需要数字的位置提供字符串("yes" 和 "no")。
例如,将所有 "yes" 替换为 1,将所有 "no" 替换为 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(或"no")组。这些是 2/3 或 0.666...
因此,如果您的模型无法从提供的特征中学到任何东西,它将始终输出零(因为所有系数都为零)。因此,对于任何输入,预测的 class 将为 0(或 "no")。这就是为什么你总是得到相同的分数:模型总是预测 0 和 2/3 的数据属于零 class,所以你的模型在 66% 的情况下是正确的。
根据我提供的数据样本,您会发现如果我们使用 "x" 和 "y" 列或 "zeros" 列,它确实会产生影响。在第一种情况下,我们得到超过 72% 的分数。如果我们只使用无意义的 "zeros",我们得到 66%,因为我们数据集的 class 分布。