拟合和预测:估计器基础
背景
Scikit-learn提供了数十种内置的机器学习算法和模型,称为估算器。可以使用其拟合方法将每个估计量拟合到一些数据。其中我们适合 RandomForestClassifier中的一些非常基本的数据。
代码
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state=0)
X = [[1,2,3],
[11,12,13]]
y = [0,1]
clf.fit(X,y)
print(clf.predict(X))
print(clf.predict([[14,15,16],[14,15,16]]))
总结
所述拟合方法通常接受2个输入:样本矩阵X。样本个数表示为行数,特征个数表示为列列数。目标值y是用于回归任务的实数,或者是用于分类的整数(或任何其他离散值集)。对于非监督学习任务,y无需指定。y通常是一维数组,其中第i个数对应于的 i第个样本(行)的目标X。估算器拟合后,可用于预测新数据的目标值。无需重新训练估算器。
转换器和预处理器
背景
机器学习工作流程通常由不同的部分组成。典型的pipline包括一个转换或插入数据的预处理步骤,以及一个预测目标值的最终预测器。
在中scikit-learn,预处理器和转换器遵循与estimator对象相同的API(实际上它们都继承自同一 BaseEstimator类)。转换对象没有预测方法,但是有一个 输出新转换的样本矩阵的转换方法X。
代码
from sklearn.preprocessing import StandardScaler
X = [[0,15],[1,-10]]
print(StandardScaler().fit(X).transform(X))
总结
转换器和估计器都是继承于BaseEstimator类,那么由此可见,转换器其实和估计器有着相似的原理。在我的理解看来,转换器本质上就是一个估计器,具体原理如下:通过fit方法,将样本进行拟合,然后通过transform方法,将样本矩阵转换为拟合后的矩阵,即实现了转化。
管道:链接预处理器和估计器
背景
可以将转换器和估计器(预测器)组合在一起成为一个统一的对象:Pipeline。Pipeline提供相同的API作为常规估计:它可以安装并使用与预测fit和predict。正如我们将在后面看到的,使用管道还可以防止数据泄漏,即在训练数据中泄露一些测试数据。在以下示例中,我们加载Iris数据集,将其分为训练集和测试集,然后根据测试数据计算管道的准确性得分。
train_test_split函数:https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
代码
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# create a pipeline object
pipe = make_pipeline(
StandardScaler(),
LogisticRegression(random_state=0)
)
# load the iris dataset and split it into train and test sets
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# fit the whole pipeline
pipe.fit(X_train, y_train)
# we can now use it like any other estimator
print(accuracy_score(pipe.predict(X_test), y_test))
总结
pipline是一个结合了转换器和估计器的对象,可以在管道中使用转换器和估计器的功能。但是从上述代码中,我没有太看出转换器的体现,希望在后续的学习过程中可以明白pipline的原理和使用方法。
模型评估
背景
模型拟合到一些数据并不意味着它将在其他的数据上有很好的预测效果。我们刚刚看到了train_test_split将数据集分为训练集和测试集,但是scikit-learn它提供了许多其他模型评估工具,尤其是用于交叉验证的工具。我们在这里简要展示了如何使用cross_validate帮助程序执行5倍交叉验证过程。
交叉验证:交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力。
代码
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) # defaults to 5-fold CV
print(result['test_score']) # r_squared score is high because dataset is easy
总结
make_regression()函数生成一个随机线性模型,其返回值为X(样本矩阵),y(输出矩阵)。通过cross_validate,可以用来进行模型评估,默认进行的是五重折叠验证。因为X,y都是比较简单的数,所以验证出来的拟合度比较高。
自动参数搜索
背景
所有估计器都有可以调整的参数(在文献中通常称为超参数)。估计器的泛化能力通常关键取决于几个参数。例如RandomForestRegressor具有n_estimators 来定林中树木数量的max_depth参数,以及 确定每棵树的最大深度的参数。通常,不清楚这些参数的确切值是多少,因为它们取决于手头的数据。Scikit-learn提供了自动查找最佳参数组合的工具(通过交叉验证)。在以下示例中,我们使用对象随机搜索随机森林的参数空间 RandomizedSearchCV。搜索结束后,RandomizedSearchCV就是=作为RandomForestRegressor的最佳参数集。
fetch_california_housing:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html
代码
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)
# define the parameter space that will be searched over
param_distributions = {'n_estimators': randint(1, 5),
'max_depth': randint(5, 10)}
# now create a searchCV object and fit it to the data
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_
# the search object now acts like a normal random forest estimator
# with max_depth=9 and n_estimators=4
search.score(X_test, y_test)
总结
RandomizedSearchCV是一个搜索最佳参数对象,其原理大概为:随机生成多组估计器,比较不同估计器的预测效果,选择估计效果最好的估计器的参数作为最佳参数。