一、模型评估
模型评估就是使用交叉验证,获取评分。
from sklearn.datasets import make_regression from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_validate # 产生回归任务的数据集,n_samples 为 1000个样本 X, y = make_regression(n_samples=1000, random_state=0) lr = LinearRegression() # 线性回归函数 result = cross_validate(lr, X, y) # 默认5折交叉验证过程 result['test_score'] # r_squared得分高,因为数据集很简单
二、自动搜索参数
所有估计器都有可以调整的参数(在文献中通常称为超参数)。
估计器的泛化能力通常关键取决于几个参数。例如,a RandomForestRegressor具有n_estimators 确定林中树木数量的max_depth参数,以及 确定每棵树的最大深度的参数。通常,不清楚这些参数的确切值是多少,因为它们取决于手头的数据。
Scikit-learn提供了自动查找最佳参数组合的工具(通过交叉验证)。在以下示例中,我们使用对象随机搜索随机森林的参数空间 RandomizedSearchCV。搜索结束后,RandomizedSearchCV行为就像是RandomForestRegressor已安装了最佳参数集的
估计器: 用于分类、聚类和回归分析的函数。
泛化能力:是指机器学习算法对新鲜样本的适应能力
RandomForestRegressor: 随机森林函数
n_estimators:决策数的个数 默认是10。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值
max_depth: 树的最大深度
RandomizedSearchCV: 随机搜索超参数,通过它寻找到最佳参数值
过拟合:一个模型在训练的时候表现的很好,在测试集表现的很差,就是过拟合。
下面例子来源于网络:
好比你想学习追妹子。
先找你表妹问喜欢什么,表妹说她喜欢干净帅气的男生,还说她喜欢周杰伦,喜欢火锅,喜欢酸菜鱼,合计一百条规矩。你规规矩矩地按照要求学习,终于符合表妹的一切要求,0 Error,训练完成,超级自信准备出去试试追个妹子。
可是换了个妹子,发现学到的似乎没想象中有用。第二个妹子只要你干净帅气。后面的九十八条她都不care,她甚至讨厌吃火锅,那后面98条只会增加误差。这就过拟合了。
怎么防止过拟合呢?应该用cross validation,交叉验证。
解释起来就是,你在你表妹那儿学到的东西,在你表姐那儿测试一下对不对。在你表姐那儿学到的,在你二姐那测试一下。来来回回用不同的测试对象和训练对象做交叉比对。这样学到规律就不会过拟合啦~
作者:刘文博
链接:https://www.zhihu.com/question/32246256/answer/83898785
来源:知乎
欠拟合: 学习追妹子的技术不到家。需要继续学习。并且添加大姐,三姐,四姐的喜好。
正则化: 防止过拟合, 本质约束(限制)要优化的参数。
简单来说,正则化是一种为了减小测试误差的行为(有时候会增加训练误差)。我们在构造机器学习模型时,最终目的是让模型在面对新数据的时候,可以有很好的表现。当你用比较复杂的模型比如神经网络,去拟合数据时,很容易出现过拟合现象(训练集表现很好,测试集表现较差),这会导致模型的泛化能力下降,这时候,我们就需要使用正则化,降低模型的复杂度。
个人感觉,“正则化”这几个字叫的实在是太抽象了。机器学习的难度就是,太多的名词。真希望大道至简。
案例代码:
from sklearn.datasets import fetch_california_housing from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import RandomizedSearchCV from sklearn.model_selection import train_test_split from scipy.stats import randint # 加载加利福尼亚州住房数据集 X, y = fetch_california_housing(return_X_y=True) # 拆分数据为训练数据集和测试数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 定义要搜索的参数字典 param_distributions = {'n_estimators': randint(1, 5), 'max_depth': randint(5, 10)} #现在创建一个SearchCV对象并将其拟合数据 search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5, param_distributions=param_distributions, random_state=0) search.fit(X_train, y_train) # 返回最好的参数 search.best_params_ # 搜索对象现在就像普通的随机森林估计器一样 # with max_depth=9 and n_estimators=4 search.score(X_test, y_test)