如何知道我是否过拟合/欠拟合我的数据?

3
所以我需要建立一个回归模型,基于11个输入来预测葡萄酒的质量。目前我正在评估各种算法的均方误差、平均绝对误差和R2分数。我想做出选择哪个算法使用的决定,但在此之前,我想确保我的数据没有过度拟合/欠拟合。以下是我使用的数据集的链接(它有点不同,但数据完全相同),以及我的整个代码。
非常感谢任何帮助!

Data: https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/

此外,我从以下 Kaggle 链接中复制了大部分代码: https://www.kaggle.com/jhansia/regression-models-analysis-on-the-wine-quality

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

wine = pd.read_csv('wineQualityReds.csv', usecols=lambda x: 'Unnamed' not in x,)

wine.head()

y = wine.quality
X = wine.drop('quality',axis = 1)

from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y = train_test_split(X,y,random_state = 0, stratify = y)

from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(train_x)
train_x_scaled = scaler.transform(train_x)

test_x_scaled = scaler.transform(test_x)

from sklearn import model_selection
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_absolute_error

models = []
models.append(('DecisionTree', DecisionTreeRegressor()))
models.append(('RandomForest', RandomForestRegressor()))
models.append(('GradienBoost', GradientBoostingRegressor()))
models.append(('SVR', SVR()))
names = []

for name,model in models:
    kfold = model_selection.KFold(n_splits=5,random_state=2)
    cv_results = model_selection.cross_val_score(model,train_x_scaled,train_y, cv= kfold, scoring = 'neg_mean_absolute_error')
    names.append(name)
    msg  = "%s: %f" % (name, -1*(cv_results).mean())
    print(msg)


model = RandomForestRegressor()
model.fit(train_x_scaled,train_y)
pred_y = model.predict(test_x_scaled)

from sklearn import metrics

print('Mean Squared Error:', metrics.mean_squared_error(test_y, pred_y))  
print('Mean Absolute Error:', metrics.mean_absolute_error(test_y, pred_y))  
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(test_y, pred_y)))
print('R2:', metrics.r2_score(test_y, pred_y))

2
如果您在训练集上没有获得很高的准确度,那么它可能是欠拟合。如果您在训练集上获得了很高的准确度,但在未看见/新的测试集上没有获得很高的准确度,则可能是过拟合。这是检查欠拟合和过拟合的简单方法之一。因此,请检查模型在训练集和测试集上的准确度。 - vb_rises
更好的提问地点:https://stats.stackexchange.com/questions - PV8
1
@desertnaut 很抱歉,我原以为有人可以给我指示一些可用的代码,所以才在这里询问。我明白概念,但不知道要使用什么代码来帮助我可视化欠拟合/过拟合。 - Heinrich de Beer
请检查此链接 https://web.archive.org/web/20170815214245/https://www.autonlab.org/_media/tutorials/overfit10.pdf。 - secretive
@vbrises,您的评论不仅是出色的建议,而且我理解这也是将数据分成训练集和测试集的主要原因之一。 - James Phillips
1个回答

0

你可以在数据集上使用交叉验证来判断其是否过拟合或欠拟合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接