为了测试这个功能,我创建了一个data.csv文件。所以我做了这个实验。
s1;s2;s3;s4;result1;2;3;4;5;152;1;3;1;2;919;21;0;0;0;4011;9;0;1;5;265;5;5;5;5;2580;1;1;1;1;841;2;3;1;1;81;0;0;1;1;310;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 score is not well-defined with less than two samples. warnings.warn(msg, UndefinedMetricWarning)
这是怎么回事?
回答:
原因是你设置的train_test_split
中的test_size
太小了;在只有10行的数据集中,test_size=0.1
相当于测试集中的单个数据点:
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.65298209559413x_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个列名,结果是pandas在读取数据框时将第一列解释为索引(注意上面的x_test
变量中缺少了1
)。你应该在标题中添加一个s5
并移除index_col=0
,即:
data = pd.read_csv('example.csv', sep=';')
在发生错误时,始终仔细检查你的变量是值得的。
虽然与你的问题无关,但将R^2称为acc
(暗示准确度)并不是好的做法,因为R2和准确度是不同的性能度量,而准确度在回归问题中毫无意义(它只在分类问题中有意义)。