快乐学习
前程无忧、中华英才非你莫属!

Python人工智能-scikit-learn-03

一、模型评估


模型评估就是使用交叉验证,获取评分。

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)

 

打赏

未经允许不得转载:同乐学堂 » Python人工智能-scikit-learn-03

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

特别的技术,给特别的你!

联系QQ:1071235258QQ群:226134712
error: Sorry,暂时内容不可复制!