机器学习是一个反复的过程。您将面临选择使用哪些预测变量,使用哪种类型的模型,向这些模型提供哪些参数的选择。到目前为止,您已经通过data-driven way数据驱动的方式通过验证模型质量来做出这些选择(或释义)。但是这种方法有一些缺点。通常,模型将保留约20%的数据或1000行作为验证数据集。但这在确定模型分数方面留下了一些随机的机会。使得模型的效果无法预料。通常,验证集validation set越大,我们的模型质量度量中的随机性(即“噪声”)就越少,并且可靠性也就越高。但只能通过从训练数据中删除行来获得较大的验证集,而较小的训练数据集意味着较差的模型!
在交叉验证中,我们对数据的不同子集运行建模过程,以获取模型质量的多种度量。例如,我们可以将数据分为5个部分,每个部分占整个数据集的20%。在这种情况下,将数据分为5个“folds”:
大概是这样:
[验证集][-----------训练集----------------------]
-----------][验证集][-----------训练集-----------
----------------------][验证集][-----------训练集
--------训练集---------------][验证集][----------
[----------------训练集-----------------][验证集]
1.要做出很多建模决策:交叉验证可以更准确地衡量模型质量。但是,交叉验证会使得运行时间变更长
对于模型运行的时间只需要几分钟的那种较小的数据集,不需要考虑太多的计算负担,则应运行交叉验证。
2.对于较大的数据集,单个验证集就足够了。
3.另外,您可以运行交叉验证,看看每个实验的分数是否接近。如果每个实验产生相同的结果,则单个验证集可能就足够了。
import pandas as pd
from sklearn.model_selection import train_test_split
# Read the data
train_data = pd.read_csv('.../train.csv', index_col='Id')
test_data = pd.read_csv('.../test.csv', index_col='Id')
# Remove rows with missing target, separate target from predictors
train_data.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = train_data.SalePrice
train_data.drop(['SalePrice'], axis=1, inplace=True)
# Select numeric columns only
numeric_cols = [cname for cname in train_data.columns if train_data[cname].dtype in ['int64', 'float64']]
X = train_data[numeric_cols].copy()
X_test = test_data[numeric_cols].copy()
创建管道并使用SimpleImputer()
替换数据中的缺失值 ;使用RandomForestRegressor()
训练随机森林模型进行预测。设置随机森林模型中树木数量的参数 n_estimators为50,并设置random_state确保可重复性。
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
my_pipeline = Pipeline(steps=[
('preprocessor', SimpleImputer()),
('model', RandomForestRegressor(n_estimators=50, random_state=0))
])
使用scikit-learn中的cross_val_score()函数获取交叉验证分数。 其中cv参数用来设置folds数量。使用cross_val_score()
函数来获取平均绝对误差(MAE),该平均误差在五个不同的folds中平均。使用cv
参数设置了folds。
from sklearn.model_selection import cross_val_score
# Multiply by -1 since sklearn calculates *negative* MAE
scores = -1 * cross_val_score(my_pipeline, X, y,
cv=5,
scoring='neg_mean_absolute_error')
print("Average MAE score:", scores.mean())
Average MAE score: 18276.410356164386
在本练习中,您将使用交叉验证为机器学习模型选择参数。
首先编写函数get_score(),如下:
-使用X和Y中的数据以创建folts,
-SimpleImputer()
(默认保留所有参数)以替换缺少的值,以及
-RandomForestRegressor()
(带有random_state = 0
)以适应随机森林模型。
设置随机森林模型中树木的数量时,将使用提供给get_score()的n_estimators参数。
def get_score(n_estimators):
my_pipeline = Pipeline(steps=[
('preprocessor', SimpleImputer()),
('model', RandomForestRegressor(n_estimators, random_state=0))
])
scores = -1 * cross_val_score(my_pipeline, X, y,
cv=3,
scoring='neg_mean_absolute_error')
return scores.mean()
使用在步骤1中定义的函数来评估模型性能,这些性能与随机森林中树数的八个不同值相对应:50、100、150,…,300、350、400。将结果存储在Python字典“result”中,其中“result[i]”是“ get_scores(i)”返回的平均MAE。’’’
#results ={{i:get_score(i) for i in range(50,50,400)}}# Your code here TypeError: unhashable type: 'dict'
results={}
for i in range(50,450,50):
results[i] = get_score(i)
'''使用matplotlib来展现训练结果【%matplotlib仅在Ipython中可直接调用,pycharm 中无法实现】
import matplotlib.pyplot as plt
%matplotlib
plt.plot(results.keys(), results.values())
plt.show()'''
#获得最小值--最佳模型
low=results[50]
for i in results.keys():
print("the %d : %f \n"%(i,results[i]))
if(results[i]<low):
low=results[i]
print("the low is %f :\n"%low)
the 50 : 18353.839351
the 100 : 18395.215168
the 150 : 18288.730021
the 200 : 18248.345890
the 250 : 18255.269222
the 300 : 18275.241923
the 350 : 18270.291833
the 400 : 18270.197974
the low is 18248.345890