sklearn_0.开始

0.1拟合与预测:估计器基础

# ensemble中导入随机森林
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(random_state=0)
X = [[ 1,  2,  3],  # 2 样本, 3 features
     [11, 12, 13]]
y = [0, 1]  # classes of each sample
clf.fit(X, y)

RandomForestClassifier(random_state=0)

fit方法通常接受 2 个输入:样本矩阵(或设计矩阵)X。X 的大小通常为 (n_samples, n_features),这意味着样本表示为行,特征表示为列。
目标值 y 是回归任务的实数,或分类的整数(或任何其他离散值集)。
对于无监督学习任务,不需要指定 y。
y 通常是一维数组,其中第 i 个条目对应于 X 的第 i 个样本(行)的目标。
X 和 y 通常都应该是 numpy 数组或等效的类似数组的数据类型,尽管一些估计器使用其他格式,例如稀疏矩阵。

lf.predict(X)  # 预测训练集的类

array([0, 1])

clf.predict([[4, 5, 6], [14, 15, 16]])  # 预测新数据的类

array([0, 1])

0.2transformers与前处理器

   机器学习工作流常由不同部分组成,一个典型的pipeline由一个转换或插补数据的预处理步骤和一个预测目标值的最终预测器组成。
# 前处理器中导入transformer
from sklearn.preprocessing import StandardScaler

X = [[0, 15], [1, -10]]
# 根据计算的缩放值缩放数据
StandardScaler().fit(X).transform(X)

array([[-1., 1.], [ 1., -1.]])

有时,希望对不同的features应用不同的转换:ColumnTransformer 专为这些用例而设计。

0.3pipelines:链接预处理器和估计器

变换器和估计器(预测器)可以组合成一个统一的对象:管道。
管道提供与常规估计器相同的 API:它可以拟合并用于使用 fit 和 predict 进行预测。正如我们稍后将看到的,使用管道还可以防止数据泄露,即在训练数据中公开一些测试数据。在以下示例中,我们加载 Iris 数据集,将其拆分为训练集和测试集,并计算管道在测试数据上的准确度得分:

# 导入transformer
from sklearn.preprocessing import StandardScaler
# 导入逻辑回归
from sklearn.linear_model import LogisticRegression
# 导入pipeline
from sklearn.pipeline import make_pipeline
# 数据集中导入Iris
from sklearn.datasets import load_iris
# 模型选择中导入划分测试集
from sklearn.model_selection import train_test_split
# 指标中导入精确分数
from sklearn.metrics import accuracy_score

# 创建一个pipeline对象
pipe = make_pipeline(StandardScaler(), LogisticRegression())
# 载入iris数据集并划分训练集与测试集
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 拟合整个管道
pipe.fit(X_train,y_train)

Pipeline(steps=[(‘standardscaler’,StandardScaler()),(‘logisticregression’,LogisticRegression())])

此时可像其他估计器一样使用它了

accuracy_score(pipe.predict(X_test),y_test)

0.9736842105263158

0.4模型评估

我们刚刚看到了将数据集拆分为训练集和测试集的train_test_split 助手,但 scikit-learn 提供了许多其他工具用于模型评估,特别是用于交叉验证。
我们在这里简要展示了如何使用 cross_validate 帮助程序执行 5 折交叉验证过程。注意,也可以手动迭代折叠,使用不同的数据拆分策略,并使用自定义评分函数。请参阅我们的用户指南了解更多详情:

# 数据集中导入make_regression
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_validate

X, y = make_regression(n_samples=1000, random_state=0)
lr = LinearRegression()
result = cross_validate(lr, X, y)  # 默认5fold交叉验证
result['test_score']

array([1.,1.,1.,1.,1.])

0.5自动参数搜索

所有估计器都有可以调整的参数(在文献中通常称为超参数)。估计器的泛化能力通常严重依赖于一些参数。例如,RandomForestRegressor 有一个 n_estimators 参数决定森林中的树的数量,还有一个 max_depth 参数决定每棵树的最大深度。
很多时候,这些参数的确切值应该是什么并不明确,因为它们取决于手头的数据。
Scikit-learn 提供了自动寻找最佳参数组合的工具(通过交叉验证)。在以下示例中,我们使用 RandomizedSearchCV 对象随机搜索随机森林的参数空间。搜索结束后,RandomizedSearchCV 的行为就像一个 RandomForestRegressor,它已经安装了最佳参数集。在用户指南中阅读更多信息:

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)

RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5, param_distributions={‘max_depth’
<scipy.stats._distn_infrastructure.rv_frozen object at 0x0000026274D040A0>, ‘n_estimators’:
<scipy.stats._distn_infrastructure.rv_frozen object at 0x000002624AF25460>}, random_state=0)

search.best_params_

{‘max_depth’: 9, ‘n_estimators’: 4}

搜索对象现在就像一个普通的随机森林估计器

search.score(X_test, y_test)

0.735363411343253

注意:在实践中,您几乎总是希望搜索整个管道,而不是单个估算器。
主要原因之一是,如果您在不使用管道的情况下对整个数据集应用预处理步骤,然后执行任何类型的交叉验证,您将打破训练和测试数据之间独立性的基本假设。实际上,由于您使用整个数据集对数据进行了预处理,因此训练集可以获得有关测试集的一些信息。这将导致高估估计器的泛化能力(您可以在这篇 Kaggle(https://www.kaggle.com/alexisbcook/data-leakage )文章中阅读更多内容)。使用管道进行交叉验证和搜索将在很大程度上使您远离这个常见的陷阱。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值