R^2 分数在少于两个样本的情况下定义不明确。 Python Sklearn

Posted

技术标签:

【中文标题】R^2 分数在少于两个样本的情况下定义不明确。 Python Sklearn【英文标题】:R^2 score is not well-defined with less than two samples. Python Sklearn 【发布时间】:2019-11-05 15:49:11 【问题描述】:

我正在使用线性回归分类器来预测一些值。 我已经弄清楚了输出的基本部分,现在它看起来像这样:

import time as ti
import pandas as pd 
import numpy as np
from matplotlib import pyplot as plt 
import csv
from sklearn.datasets import load_boston
from sklearn import preprocessing, svm
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from scipy.interpolate import * 
import datetime

data = pd.read_csv(r"C:\Users\simon\Desktop\Datenbank\visualisierung\includes\csv.csv")         
x = np.array(data["day"])   
y = np.array(data["balance"])

reg = linear_model.LinearRegression()
X_train, X_test, y_train, y_test, i_train, i_test = train_test_split(x, y, data.index, test_size=0.2, random_state=4)

X_train = X_train.reshape(-1, 1)
X_test = X_test.reshape(-1, 1)

i_train = i_train.values.reshape(-1, 1)
i_test = i_test.values.reshape(-1, 1)


reg.fit(i_train, y_train)

print(reg.score(i_test, y_test))

252128,6/6/19
252899,7/6/19
253670,8/6/19
254441,9/6/19

我总共有 27 行。

由于某种原因它不起作用。

UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.

dtypes 和形状是:

X_train, X_test = object #dtype
X_train = (21,)  #shape
X_test = (6,)    #shape

y_train, y_test = int64 #dtype
y_train, y_test = (1, 21) #shape

i_train, i_test = int64 #dtype
i_train, i_test = (1, 21) #shape

X_train、X_test、y_train、y_test、i_train、i_test都是a:

<class 'numpy.ndarray'>

我可以想象那是因为我没有足够的例子。

为什么会发生这种情况,我该如何预防?

【问题讨论】:

告诉我们有关数组的信息,xX_train 等。形状和数据类型。 查看所需的尺寸。通常第一维是样本,第二维是特征 警惕那些对象 dtype 数组 为什么将索引i_train 传递给拟合函数而不是特征X_train 因为对于线性回归分类器,x achse 并不重要,并且由于某种原因分类器只将浮点数作为输入 【参考方案1】:

正如sklearn documentation建议的那样:

X : array-like or sparse matrix, shape (n_samples, n_features)
    Training data

y : array_like, shape (n_samples, n_targets)
    Target values. Will be cast to X’s dtype if necessary

因此,如果您的数据集仅包含 1 个特征,您需要使用以下方法重塑您的训练和测试集:

X_train = X_train.reshape(-1, 1)
X_test = X_test.reshape(-1, 1)
y_train = y_train.reshape(-1, 1)
y_test = y_test.reshape(-1, 1)

您的其余代码应该可以正常工作。


按照 OP 的规范,数据集似乎是一个时间序列。线性回归不会正确建模您的数据,但作为一个有趣的玩具示例,您可以将日期转换为 POSIX 时间、拆分数据并测试不同的算法。

假设你的数据集:

    balance day
0   252128  6/6/19
1   252899  7/6/19
2   253670  8/6/19
3   254441  9/6/19
4   255944  10/6/19
5   256041  11/6/19
6   256670  12/6/19
7   257441  13/6/19
8   258128  14/6/19
9   258899  15/6/19
10  259670  16/6/19
11  260241  17/6/19
12  260444  18/6/19
13  260341  19/6/19
14  260670  20/6/19
15  261441  21/6/19

你可以这样修改代码:

import pandas as pd
from sklearn import linear_model

data = pd.read_csv('csv.csv')

X = pd.to_datetime(data['day'])
# convert to POSIX time by dividing by 10**9
X = X.astype("int64").values.reshape(-1, 1) // 10**9
y = data['balance']

# split the data
X_train = X[:12]
y_train = y[:12]
X_test = X[-4:]
y_test = y[-4:]

reg.fit(X_train, y_train)

print(reg.score(X_test, y_test))

reg.predict(X_test)

你得到了什么?一个非常糟糕的解决方案。

【讨论】:

这会返回一个错误,指出 int64 索引没有属性“reshape” type(X_train)type(X_test)type(y_train)type(y_test) 的输出是什么? 修改分割线为X_train, X_test, y_train, y_test = train_test_split(x, y, data.index,test_size=0.2, random_state=4)。然后是我的代码,然后是 reg.fit(X_train, y_train)print(reg.score(X_test, y_test)) 这不起作用,因为我的 X_train 和 X_test 数组中充满了 ("1/7/19") 之类的值,无法转换为浮点数。 请编辑您的问题,提供您的完整代码。否则,这个问题不会有用。谢谢。

以上是关于R^2 分数在少于两个样本的情况下定义不明确。 Python Sklearn的主要内容,如果未能解决你的问题,请参考以下文章

警告:精度和 F 分数定义不明确,在没有预测样本的标签中设置为 0.0。使用 `zero_division` 参数

UndefinedMetricWarning:召回率和 F 分数定义不明确,在没有真实样本的标签中设置为 0.0。 'recall', 'true', 平均, warn_for)

为啥 scikit learn 说 F1 分数不明确,FN 大于 0?

卡方检验结果怎么看呀,

曼惠特尼学位检查

Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]