使用cross val得分得分为零

时间:2018-05-30 13:27:29

标签: pandas numpy machine-learning scikit-learn regression

我正在尝试在我的数据集上使用cross_val_score,但我不断得到零作为分数:

这是我的代码:

df = pd.read_csv("Flaveria.csv")
df = pd.get_dummies(df, columns=["N level", "species"], drop_first=True)

# Extracting the target value from the dataset
X = df.iloc[:, df.columns != "Plant Weight(g)"]
y = np.array(df.iloc[:, 0], dtype="S6")

logreg = LogisticRegression()
loo = LeaveOneOut()

scores = cross_val_score(logreg, X, y, cv=loo)
print(scores)

要素是分类值,而目标值是浮点值。我不确定为什么我只能获得零。

在创建虚拟变量

之前,数据看起来像这样
N level,species,Plant Weight(g)
L,brownii,0.3008
L,brownii,0.3288
M,brownii,0.3304
M,brownii,0.388
M,brownii,0.406
H,brownii,0.3955
H,brownii,0.3797
H,brownii,0.2962

更新了我仍在零的代码:

 from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score

from sklearn.ensemble import RandomForestRegressor


import numpy as np
import pandas as pd

# Creating dummies for the non numerical features in the dataset

df = pd.read_csv("Flaveria.csv")
df = pd.get_dummies(df, columns=["N level", "species"], drop_first=True)

# Extracting the target value from the dataset
X = df.iloc[:, df.columns != "Plant Weight(g)"]
y = df.iloc[:, 0]

forest = RandomForestRegressor()
loo = LeaveOneOut()

scores = cross_val_score(forest, X, y, cv=loo)
print(scores)

1 个答案:

答案 0 :(得分:2)

将军cross_val_score将数据拆分为训练并使用给定的迭代器进行测试,然后将模型与训练数据拟合并在测试折叠上得分。对于回归,r2_score是scikit中的默认值。

您已将LeaveOneOut()指定为cv迭代器。因此每个折叠将包含一个测试用例。在这种情况下,R_squared将始终为0.

查看formula for R2 in wikipedia

R2 = 1 - (SS_res/SS_tot)

并且

SS_tot = sqr(sum(y - y_mean))

对于单个案例,y_mean将等于y值,因此分母为0.因此整个R2未定义(Nan)。在这种情况下,scikit-learn会将值设置为0,而不是nan

将LeaveOneOut()更改为任何其他CV迭代器(如KFold),将为您提供一些非零结果,如您所观察到的那样。

相关问题