我将X
和y
中的功能分开,然后在用k倍交叉验证将其分割后对火车测试数据进行预处理。之后,我将火车数据拟合到我的随机森林回归模型并计算置信度得分。拆分后为什么要进行预处理?因为人们告诉我,这样做更正确,并且出于我的模型性能,我保留了这一原则。
这是我第一次使用KFold交叉验证,因为我的模型评分过高,我认为我可以通过交叉验证来解决。我仍然对如何使用它感到困惑,我已经阅读了文档和一些文章,但是我并没有真正了解到它对我的模型的真正含义,但无论如何我还是尝试了,但是我的模型仍然适合。使用火车测试拆分或交叉验证得出的模型分数仍为0.999,我不知道我的错误是因为我是使用此方法的新手,但我认为也许我做错了,因此无法解决过度拟合问题。请告诉我我的代码出了什么问题以及如何解决此问题
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
import scipy.stats as ss
avo_sales = pd.read_csv('avocados.csv')
avo_sales.rename(columns = {'4046':'small PLU sold',
'4225':'large PLU sold',
'4770':'xlarge PLU sold'},
inplace= True)
avo_sales.columns = avo_sales.columns.str.replace(' ','')
x = np.array(avo_sales.drop(['TotalBags','Unnamed:0','year','region','Date'],1))
y = np.array(avo_sales.TotalBags)
# X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
kf = KFold(n_splits=10)
for train_index, test_index in kf.split(x):
X_train, X_test, y_train, y_test = x[train_index], x[test_index], y[train_index], y[test_index]
impC = SimpleImputer(strategy='most_frequent')
X_train[:,8] = impC.fit_transform(X_train[:,8].reshape(-1,1)).ravel()
X_test[:,8] = impC.transform(X_test[:,8].reshape(-1,1)).ravel()
imp = SimpleImputer(strategy='median')
X_train[:,1:8] = imp.fit_transform(X_train[:,1:8])
X_test[:,1:8] = imp.transform(X_test[:,1:8])
le = LabelEncoder()
X_train[:,8] = le.fit_transform(X_train[:,8])
X_test[:,8] = le.transform(X_test[:,8])
rfr = RandomForestRegressor()
rfr.fit(X_train, y_train)
confidence = rfr.score(X_test, y_test)
print(confidence)
最佳答案
过度拟合的原因是,基于非正规树的模型将调整数据,直到正确分类所有训练样本为止。例如,请参见以下图片:
如您所见,这不能很好地概括。如果不指定参数来规范树,则该模型将很难拟合测试数据,因为它基本上只会学习训练数据中的噪声。可以通过sklearn
来规范化树的方法有很多,您可以找到它们here。例如:
通过适当的正则化,您可以获得一个很好地概括测试数据的模型。例如看一个正规化的模型:
要规范化模型,请实例化
RandomForestRegressor()
模块,如下所示:rfr = RandomForestRegressor(max_features=0.5, min_samples_leaf=4, max_depth=6)
这些参数值是任意的,取决于您如何找到最适合您数据的参数。您可以使用特定领域的知识来选择这些值,也可以使用超参数调整搜索(例如
GridSearchCV
或RandomizedSearchCV
)来选择这些值。除此之外,估算均值和中位数可能会给您的数据带来很多干扰。除非您别无选择,否则我建议您不要这样做。
关于python - K折叠交叉验证无法修复过度拟合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60684943/