模型评价和验证
1 数据探索/分析
1.1 计算描述统计信息
用NumPy而非Pandas。并不是我们对NumPy有偏好,我们希望通过这里让你了解:虽然他们在大部分时候得出的结果相同,但是在某些情况下,例如这里的求标准差的计算上,是不一样的。具体区别可以查看他们的文档:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
1.2 特征观察---解释各项属性与目标变量(增加或减少之间)的关联
可以用先验知识(domain knowledge)做一些推断,直接画图当然更好!机器学习算法可以帮我们验证我们的推断是否正确。
2 建模
2.1 定义衡量标准(用R2来表示拟合程度)
如果不能对模型的训练和测试的表现进行量化地评估,我们就很难衡量模型的好坏。通常我们会定义一些衡量标准,这些标准可以通过对某些误差或者拟合程度的计算来得到。在这个项目中,你将通过运算决定系数R2来量化模型的表现。模型的决定系数是回归分析中十分常用的统计信息,经常被当作衡量模型预测能力好坏的标准。
R2的数值范围从0至1,表示目标变量的预测值和实际值之间的相关程度平方的百分比。一个模型的R2值为0还不如直接用平均值来预测效果好;而一个R2值为1的模型则可以对目标变量进行完美的预测。从0至1之间的数值,则表示该模型中目标变量中有百分之多少能够用特征来解释。模型也可能出现负值的R2,这种情况下模型所做预测有时会比直接计算目标变量的平均值差很多。
from sklearn.metrics import r2_score
def performance_metric(y_true, y_predict):
# TODO: Calculate the performance score between 'y_true' and 'y_predict'
score = r2_score(y_true, y_predict)
# Return the score
2.2 数据分隔和重排
你需要把波士顿房屋数据集分成训练和测试两个子集。通常在这个过程中,数据也会被重新排序,以消除数据集中由于排序而产生的偏差。
使用sklearn.model_selection中的train_test_split, 将features和prices的数据都分成用于训练的数据子集和用于测试的数据子集。分割比例为:80%的数据用于训练,20%用于测试;选定一个数值以设定train_test_split中的random_state,这会确保结果的一致性;最终分离出的子集为X_train,X_test,y_train,和y_test。
# TODO: Import 'train_test_split'
from sklearn.model_selection import train_test_split
# TODO: Shuffle and split the data into training and testing subsets
X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=42)
3 分析模型表现
3.1 学习曲线 可以辨别模型表现的好坏
本例中学习曲线分析了一个决策树模型在不同最大深度下的表现。每一条曲线都直观的显示了随着训练数据量的增加,模型学习曲线的训练评分和测试评分(本例中用决定系数R2)的变化。
R^2是评价模型表现的方法之一,每个机器学习模型的建立都要有相对应的评价指标,后面我们会学到更多的评价指标。不过R^2其实也有很多局限性需要注意
https://en.wikipedia.org/wiki/Coefficient_of_determination#Caveats
可汗学院对此也有很精彩的讲解。
skearn对于常见的模型表现衡量方法也有详细的介绍。
http://scikit-learn.org/stable/modules/model_evaluation.html
传统的机器学习算法(又被称为基于统计的机器学习)在数据量达到一定程度后,更多的数据无法提升模型的表现(收敛)。深度学习的一个优势就是它可以把大量的数据利用起来,提升学习表现。
3.2 复杂度曲线
复杂度曲线展示了一个已经经过训练和验证的决策树模型在不同最大深度条件下的表现。这个图形将包含两条曲线,一个是训练的变化,一个是测试的变化。跟学习曲线相似,阴影区域代表该曲线的不确定性,模型训练和测试部分的评分都用的performance_metric函数。
从复杂度曲线中可以权衡方差和偏差,预测最优模型(最佳最大深度)。
4 评价模型表现
4.1 网格搜索和交叉验证
4.2 训练模型
使用决策树演算法训练一个模型。为了保证你得出的是一个最优模型,你需要使用网格搜索法训练模型,以找到最佳的'max_depth'参数。你可以把'max_depth'参数理解为决策树算法在做出预测前,允许其对数据提出问题的数量。决策树是监督学习算法中的一种。
def fit_model(X, y):
""" Performs grid search over the 'max_depth' parameter for a
decision tree regressor trained on the input data [X, y]. """
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(n_splits = 10, test_size = 0.20, random_state = 0)
# TODO: Create a decision tree regressor object
regressor = DecisionTreeRegressor(random_state=0)
# TODO: Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth':[1,2,3,4,5,6,7,8,9,10]}
# TODO: Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# TODO: Create the grid search object
grid = GridSearchCV(estimator = regressor,param_grid = params,scoring = scoring_fnc,cv = cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
#print(pd.DataFrame(grid.cv_results_).T)
# Return the optimal model after fitting the data
return grid.best_estimator_
4.3 最优模型即返回的最佳最大深度
4.4 预测房价并判断
4.5 分析敏感度/健壮性
(以上引用来自于Udacity 机器学习入门课中预测波士顿房价的项目)
网友评论