使用 Python K-Fold 和随机森林对子集进行交叉验证

如何解决使用 Python K-Fold 和随机森林对子集进行交叉验证

我有一个以荷兰大城市社区的能源消耗为因变量和几个自变量的数据集。我想建立一个随机森林回归模型来预测仅在阿姆斯特丹的街区的价值。现在,我尝试仅在阿姆斯特丹的街区训练模型,但数据集太小,准确度分数(RMSE、MAE、R2)很差,尽管模型在整个 large_city 数据集上表现良好。

我基本上想做的是对 RF 模型进行 10 倍交叉验证。我只想将阿姆斯特丹数据分成 10 折,然后我想将 large_city 数据集的其余部分(因此除阿姆斯特丹以外的所有社区)添加到所有折叠的训练集中,但保持测试折叠相同。

简而言之:

阿姆斯特丹 = large_cities == '阿姆斯特丹'

without_amsterdam = large_cities != '阿姆斯特丹'

10 折交叉验证,以 1/10 amsterdam 作为测试数据,9/10 amsterdam + all without_amsterdam 作为每折训练数据。

我目前编写的代码

from sklearn.model_selection import KFold,cross_val_score

amsterdam = big_cities.loc[big_cities['gm_naam'] == 'Amsterdam']
without_ams = big_cities.loc[big_cities['gm_naam'] != 'Amsterdam']

X = amsterdam.iloc[:,4:].values
y = np.array(amsterdam.iloc[:,3].values)

# split the data into 10 folds.  
# I will use this 'kf'(KFold splitting stratergy) object as 
#input to cross_val_score() method
kf = KFold(n_splits=10,shuffle=True,random_state=42)

cnt = 1
# split()  method generate indices to split data into training and test set.
for train_index,test_index in kf.split(X,y):
    print(f'Fold:{cnt},Train set: {len(train_index)},Test set:{len(test_index)}')
    cnt += 1


def rmse(score):
    rmse = np.sqrt(-score)
    print(f'rmse= {"{:.2f}".format(rmse)}')

score = cross_val_score(ensemble.RandomForestRegressor(random_state= 42),X,y,cv= kf,scoring="neg_mean_squared_error")
print(f'scores for each fold are: {score}')
rmse(score.mean())

我在上面的代码中所做的是仅对阿姆斯特丹数据进行 10 倍交叉验证。如何将 without_ams 的数据添加到阿姆斯特丹的每个火车折叠中?

我希望我的努力有意义。

解决方法

您可以提供 train 的索引,test to cross_val_score,参见 help page。因此,在您使用示例数据集的情况下:

from sklearn.model_selection import KFold,cross_val_score
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np

big_cities = pd.DataFrame(np.random.normal(0,1,(200,6)))
big_cities.insert(0,'gm_naam',np.random.choice(['Amsterdam','Stockholm','Copenhagen'],200))

关键是将您的数据框附加到阿姆斯特丹,然后是其他,您也可以通过排序来做到这一点:

amsterdam = big_cities.loc[big_cities['gm_naam'] == 'Amsterdam']
without_ams = big_cities.loc[big_cities['gm_naam'] != 'Amsterdam']

non_amsterdam_index = np.arange(len(amsterdam),len(without_ams))

combined = pd.concat([amsterdam,without_ams])

现在我们只使用 amsterdam 部分获得 cv 索引:

X = amsterdam.iloc[:,4:]
y = amsterdam.iloc[:,3]

kf = KFold(n_splits=3,shuffle=True,random_state=42)

我们将非阿姆斯特丹索引附加到每个火车折叠中:

cvs = [[np.append(i,non_amsterdam_index),j] for i,j in kf.split(X,y)]

我们可以检查一下:

for train,test in cvs:
    print("train composition")
    print(combined.iloc[train,]["gm_naam"].value_counts())
    print("test composition")
    print(combined.iloc[test,]["gm_naam"].value_counts())

您可以看到测试仅在阿姆斯特丹:

train composition
Amsterdam     48
Copenhagen    33
Stockholm     21
Name: gm_naam,dtype: int64
test composition
Amsterdam    25
Name: gm_naam,dtype: int64
train composition
Amsterdam     49
Copenhagen    33
Stockholm     21
Name: gm_naam,dtype: int64
test composition
Amsterdam    24
Name: gm_naam,dtype: int64

然后交叉验证:

score = cross_val_score(RandomForestRegressor(random_state= 42),X = combined.iloc[:,4:],y = combined.iloc[:,3],cv= cvs,scoring="neg_mean_squared_error")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?