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