Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sklearn错误:R^2分数定义不明确,样本数少于两个_Python_Machine Learning_Scikit Learn_Linear Regression - Fatal编程技术网

Python Sklearn错误:R^2分数定义不明确,样本数少于两个

Python Sklearn错误:R^2分数定义不明确,样本数少于两个,python,machine-learning,scikit-learn,linear-regression,Python,Machine Learning,Scikit Learn,Linear Regression,我构建了一个data.csv,以了解它是如何工作的。所以我做了这个 s1;s2;s3;s4;result 1;2;3;4;5;15 2;1;3;1;2;9 19;21;0;0;0;40 11;9;0;1;5;26 5;5;5;5;5;25 80;1;1;1;1;84 1;2;3;1;1;8 1;0;0;1;1;3 10;10;10;10;20;60 如您所见,result是s1、s2、s3和s4的总和。所以我这样做了 data = pd.read_csv('example.csv', sep=

我构建了一个data.csv,以了解它是如何工作的。所以我做了这个

s1;s2;s3;s4;result
1;2;3;4;5;15
2;1;3;1;2;9
19;21;0;0;0;40
11;9;0;1;5;26
5;5;5;5;5;25
80;1;1;1;1;84
1;2;3;1;1;8
1;0;0;1;1;3
10;10;10;10;20;60
如您所见,
result
s1、s2、s3和s4的总和。
所以我这样做了

data = pd.read_csv('example.csv', sep=';', index_col=0)
data = data[['s1', 's2', 's3', 's4', 'result']]
predict = 'result'


x = np.array(data.drop([predict], 1))
y = np.array(data[predict])

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size=0.1)

linear = linear_model.LinearRegression()
linear.fit(x_train, y_train)

acc = linear.score(x_test, y_test)
print(acc)
但我犯了这个错误

C:\Users\Sharki\Anaconda3\lib\site packages\sklearn\metrics\regression.py:543:UndefinedMetricWarning:R^2分数定义不明确,样本数少于两个。 警告。警告(消息,未定义的度量警告)


发生了什么事?

原因是您在
列车测试分割中要求的
测试大小
太小
test_size=0.1
,在仅有10行的数据集中,对应于测试集中的单个数据点:

x_test, y_test
# (array([[2, 3, 4, 5]]), array([15]))
因此出现了错误(实际上是一个警告,因为返回了
nan

将其至少更改为0.2:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
[...]
print(acc)
# -88.65298209559413

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)
[...]
print(acc)
# -0.5210446297916358
由于您的数据量非常小,因此请准备好计算结果R^2的波动(如上面的示例所示)

此外请注意,您的CSV文件中实际上有6个字段,但只有5个列名,其结果是在读取数据帧时将第一列解释为索引(请注意,
1
在上面显示的
x_test
变量中丢失)。您应该在标题中添加一个
s5
,并删除
索引col=0
,即:

data = pd.read_csv('example.csv', sep=';')
目视检查变量,尤其是在出现错误的情况下,总是有回报的


与您的问题无关,但将R^2称为
acc
(意味着准确度)不是好的做法,因为R2和准确度是不同的性能度量,而准确度在回归问题中毫无意义(它仅在分类中有意义)。

看一看,看起来你的问题以前有人问过。我在发布这篇文章之前看过那篇文章,但我认为情况不同。(如果是这样的话,那么我对它的理解就太差了)。我在终端上运行了相同的脚本,但它呈现出
acc=0
。也许你想检查一下不一致性?顺便说一句,您的数据结构有问题:假设第一行有5个值,
1;2.3.4.5;但只有4列
s1;s2;s3;s4。你需要多出一列,否则第一个数字会被你的
read\u csv
@tianlinhe自动索引。所有这些问题都已经在下面的答案中解决了。那么s1被当作索引来处理?有没有办法将s1用作属性而不是索引?我很抱歉,因为我对这一切感到迷惘。非常感谢你的帮助!我知道这有点离题,但如果您能告诉我在哪里或如何提高这些技能,我将不胜感激。@GeorgiaFernández您只需将文件头更改为
s1;s2;s3;s4;s5;结果
,如回答中所述。很抱歉再次打扰您,我已将文件更改为
s1;s2;s3;s4;s5;结果
,所以我假设我也需要将代码更改为
data=data[[s2',s3',s4',s5',result']
,但它返回一个neagtive整数,为什么?@GeorgiaFernández不,它应该是
data=data[[s1',s2',s3',s4',s5',result']
;我说的是添加
s5
,而不是删除
s1
。但在任何情况下,这一行都是多余的(您的
数据
变量已经是这样了)。@GeorgiaFernández的问题在于
索引col=0
-您应该删除它。更新的答案(因为我试图解决您要求的问题,而不是其他所有问题,所以错过了答案…)。