sklearn入门

参考官方文档:https://scikit-learn.org/stable/getting_started.html

Fitting and predicting: estimator basics(拟合和预测:估计器基础)

Scikit-learn内置了数十种机器学习算法和模型,这些算法和模型叫做估计器。每一个估计器都可以使用其拟合方法来拟合某些数据。下面是我们使用随机森林模型拟合一些数据的例子:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state=0)
X = [[ 1,  2,  3],  # 2 samples, 3 features
     [11, 12, 13]]
y = [0, 1]  # classes of each sample
clf.fit(X, y)

fit方法通常接收两个参数:

  • 样本矩阵X。X的大小通常为(n_samples,n_features),这意味着样本表示为行,特征表示为列。
  • 目标值y是用于回归任务的实数,或者是用于分类的整数(或任何其他离散值集)。对于无监督学习任务,无需指定y。y通常是1d数组,其中第i个条目对应于X的第i个样本(行)的目标。
    x,y通常希望是numpy数组格式(因为sklearn是基于numpy开发的包),或者等价类似于数组类型(pandas.DataFrame)。一些评估器也可以使用稀疏矩阵类型。一旦估计器拟合过数据了,就可以直接拿来做预测而无需重复训练。
clf.predict(X)  # predict classes of the training data

clf.predict([[4, 5, 6], [14, 15, 16]])  # predict classes of new data

Transformers and pre-processors(数据变换器和预处理器)

机器学习工作流通常包含许多不同部分,一个传统的流程是包含一个数据预处理步骤(数据变换、缺失值填补等)和一个最后的预测器。
在sklearn中,不同的估计器对象有着相同的数据变换API(事实上他们都是继承于BaseEstimator类)。变换器有transform方法(类似于predict方法)用来输出一个尺寸相同的变换后的矩阵。

from sklearn.preprocessing import StandardScaler
X = [[0, 15],
     [1, -10]]
StandardScaler().fit(X).transform(X)

有时候你想对不同的特征使用不同的数据变换方法,你可以使用 ColumnTransformer方法。

Pipelines: chaining pre-processors and estimators(管道:链接预处理器和估计器)

我们可以使用管道链接数据变换器和预测器,管道像传统的预测器一样提供相同的fit和predict方法。使用管道可以使我们变得代码简洁易懂,并且可以避免我们犯数据泄露的错误。

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
accuracy_score(pipe.predict(X_test), y_test)

Model evaluation(模型评估)

训练数据并不代表我们的模型能够在未知数据上表现良好,所以我们需要评估模型。我们使用train_test_split方法划分训练集测试集,除此之外,sklearn还提供了一些其他的工具进行模型评估,特别是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
result['test_score']  # r_squared score is high because dataset is easy

Automatic parameter searches(自动参数搜索)

所有估计器都有可以调整的参数(在文献中通常称为超参数)。估计器的泛化能力通常主要取决于几个参数。例如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)

# 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)

实际上,您几乎总是想在管道上而不是单个估计器上进行搜索。主要原因之一是,如果在不使用流水线的情况下对整个数据集应用预处理步骤,然后执行任何类型的交叉验证,那么您将打破训练和测试数据之间独立性的基本假设。实际上,由于您是使用整个数据集对数据进行预处理的,因此有关训练集的一些信息可用于训练集。这将导致高估估计器的泛化能力。使用管道进行交叉验证和搜索将在很大程度上避免您遇到这个常见的陷阱。

sklearn 常用方法

在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容