我正在尝试在数据集上使用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)

最佳答案

一般的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),将为您提供一些非零的结果。

关于pandas - 使用交叉Val得分获得零得分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50605956/

10-12 04:49