å…¥é—¨æŒ‡å— ======== æœ¬æŒ‡å—æ—¨åœ¨å±•示 ``scikit-learn`` æä¾›çš„一些主è¦åŠŸèƒ½ã€‚å®ƒå‡è®¾è¯»è€…具有机器å¦ä¹ 实践的基本知识(如模型拟åˆã€é¢„测ã€äº¤å‰éªŒè¯ç‰ï¼‰ã€‚请å‚考我们的 :ref:`installation instructions <installation-instructions>` æ¥å®‰è£… ``scikit-learn`` 。 ``Scikit-learn`` 是一个支æŒç›‘ç£å¦ä¹ å’Œæ— ç›‘ç£å¦ä¹ çš„å¼€æºæœºå™¨å¦ä¹ 库。它还æä¾›äº†å„ç§å·¥å…·ï¼Œç”¨äºŽæ¨¡åž‹æ‹Ÿåˆã€æ•°æ®é¢„处ç†ã€æ¨¡åž‹é€‰æ‹©ã€æ¨¡åž‹è¯„估以åŠå…¶ä»–许多实用功能。 拟åˆå’Œé¢„测:估计器基础 ------------------------ ``Scikit-learn`` æä¾›äº†æ•°åç§å†…置的机器å¦ä¹ 算法和模型,称为 :term:`estimators` 。æ¯ä¸ªä¼°è®¡å™¨éƒ½å¯ä»¥ä½¿ç”¨å…¶ :term:`fit` 方法拟åˆåˆ°æŸäº›æ•°æ®ä¸Šã€‚ 以下是一个简å•示例,我们将一个 :class:`~sklearn.ensemble.RandomForestClassifier` 拟åˆåˆ°ä¸€äº›éžå¸¸åŸºæœ¬çš„æ•°æ®ä¸Š:: >>> from sklearn.ensemble import RandomForestClassifier >>> clf = RandomForestClassifier(random_state=0) >>> X = [[ 1, 2, 3], # 2 ä¸ªæ ·æœ¬, 3 ä¸ªç‰¹å¾ ... [11, 12, 13]] >>> y = [0, 1] # æ¯ä¸ªæ ·æœ¬çš„类别 >>> clf.fit(X, y) RandomForestClassifier(random_state=0) :term:`fit` æ–¹æ³•é€šå¸¸æŽ¥å— 2 个输入: - æ ·æœ¬çŸ©é˜µï¼ˆæˆ–è®¾è®¡çŸ©é˜µï¼‰ :term:`X` 。 ``X`` 的大å°é€šå¸¸æ˜¯ ``(n_samples, n_features)`` ,这æ„å‘³ç€æ ·æœ¬è¡¨ç¤ºä¸ºè¡Œï¼Œç‰¹å¾è¡¨ç¤ºä¸ºåˆ—。 - ç›®æ ‡å€¼ :term:`y` ,对于回归任务是实数,对于分类任务是整数(或任何其他离散值集åˆï¼‰ã€‚å¯¹äºŽæ— ç›‘ç£å¦ä¹ 任务, ``y`` ä¸éœ€è¦æŒ‡å®šã€‚ ``y`` 通常是一个一维数组,其ä¸ç¬¬ ``i`` 个æ¡ç›®å¯¹åº”于 ``X`` 的第 ``i`` ä¸ªæ ·æœ¬ï¼ˆè¡Œï¼‰çš„ç›®æ ‡ã€‚ ``X`` å’Œ ``y`` 通常期望是 numpy æ•°ç»„æˆ–ç‰æ•ˆçš„ :term:`类数组` æ•°æ®ç±»åž‹ï¼Œå°½ç®¡æŸäº›ä¼°è®¡å™¨æ”¯æŒå…¶ä»–æ ¼å¼ï¼Œå¦‚稀ç–矩阵。 一旦估计器被拟åˆï¼Œå®ƒå°±å¯ä»¥ç”¨äºŽé¢„测新数æ®çš„ç›®æ ‡å€¼ã€‚æ‚¨ä¸éœ€è¦é‡æ–°è®ç»ƒä¼°è®¡å™¨:: >>> clf.predict(X) # 预测è®ç»ƒæ•°æ®çš„类别 array([0, 1]) >>> clf.predict([[4, 5, 6], [14, 15, 16]]) # 预测新数æ®çš„类别 array([0, 1]) 您å¯ä»¥æŸ¥çœ‹ :ref:`ml_map` æ¥äº†è§£å¦‚何为您的用例选择åˆé€‚的模型。 转æ¢å™¨å’Œé¢„处ç†å™¨ -------------------- 机器å¦ä¹ 工作æµç¨‹é€šå¸¸ç”±ä¸åŒçš„部分组æˆã€‚一个典型的管é“åŒ…æ‹¬ä¸€ä¸ªé¢„å¤„ç†æ¥éª¤ï¼Œè¯¥æ¥éª¤è½¬æ¢æˆ–å¡«å……æ•°æ®ï¼Œä»¥åŠä¸€ä¸ªæœ€ç»ˆçš„é¢„æµ‹å™¨ï¼Œç”¨äºŽé¢„æµ‹ç›®æ ‡å€¼ã€‚ 在 ``scikit-learn`` ä¸ï¼Œé¢„处ç†å™¨å’Œè½¬æ¢å™¨éµå¾ªä¸Žä¼°è®¡å™¨å¯¹è±¡ç›¸åŒçš„ API(实际上它们都继承自åŒä¸€ä¸ª ``BaseEstimator`` 类)。转æ¢å™¨å¯¹è±¡æ²¡æœ‰ :term:`predict` 方法,而是有一个 :term:`transform` æ–¹æ³•ï¼Œè¯¥æ–¹æ³•è¾“å‡ºä¸€ä¸ªæ–°çš„è½¬æ¢æ ·æœ¬çŸ©é˜µ ``X`` :: >>> from sklearn.preprocessing import StandardScaler >>> X = [[0, 15], ... [1, -10]] >>> # æ ¹æ®è®¡ç®—çš„ç¼©æ”¾å€¼ç¼©æ”¾æ•°æ® >>> StandardScaler().fit(X).transform(X) array([[-1., 1.], [ 1., -1.]]) 有时,您希望对ä¸åŒçš„特å¾åº”用ä¸åŒçš„转æ¢ï¼š:ref:`ColumnTransformer<column_transformer>` æ£æ˜¯ä¸ºæ¤ç±»ç”¨ä¾‹è®¾è®¡çš„。 管é“:链接预处ç†å™¨å’Œä¼°è®¡å™¨ ------------------------------ 转æ¢å™¨å’Œä¼°è®¡å™¨ï¼ˆé¢„测器)å¯ä»¥ç»„åˆåœ¨ä¸€èµ·æˆä¸ºä¸€ä¸ªå•一的统一对象::class:`~sklearn.pipeline.Pipeline` ã€‚ç®¡é“æä¾›çš„ API 与常规估计器相åŒï¼šå¯ä»¥ä½¿ç”¨ ``fit`` å’Œ ``predict`` 进行拟åˆå’Œé¢„测。æ£å¦‚我们ç¨åŽå°†çœ‹åˆ°çš„,使用管é“还å¯ä»¥é˜²æ¢æ•°æ®æ³„露,å³åœ¨è®ç»ƒæ•°æ®ä¸æŠ«éœ²ä¸€äº›æµ‹è¯•æ•°æ®ã€‚ 在以下示例ä¸ï¼Œæˆ‘们 :ref:`load the Iris dataset <datasets>` ,将其拆分为è®ç»ƒé›†å’Œæµ‹è¯•集,并在测试数æ®ä¸Šè®¡ç®—管é“的准确性得分:: >>> 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 ... >>> # 创建一个管é“对象 >>> pipe = make_pipeline( ... StandardScaler(), ... LogisticRegression() ... ) ... >>> # åŠ è½½é¸¢å°¾èŠ±æ•°æ®é›†å¹¶å°†å…¶æ‹†åˆ†ä¸ºè®ç»ƒé›†å’Œæµ‹è¯•集 >>> 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.97... 模型评估 -------- 将模型拟åˆåˆ°æŸäº›æ•°æ®å¹¶ä¸æ„味ç€å®ƒå°†åœ¨æœªè§æ•°æ®ä¸Šé¢„测良好。这需è¦ç›´æŽ¥è¿›è¡Œè¯„估。我们刚刚看到了 :func:` ~sklearn.model_selection.train_test_split`助手,它将数æ®é›†æ‹†åˆ†ä¸ºè®ç»ƒé›†å’Œæµ‹è¯•集,但 ``scikit-learn`` 还æä¾›äº†è®¸å¤šå…¶ä»–用于模型评估的工具,特别是用于 :ref:`交å‰éªŒè¯ <cross_validation>` 。 我们在这里简è¦å±•示如何使用 :func:`~sklearn.model_selection.cross_validate` 助手执行 5 折交å‰éªŒè¯è¿‡ç¨‹ã€‚请注æ„,也å¯ä»¥æ‰‹åЍé历折å ,使用ä¸åŒçš„æ•°æ®æ‹†åˆ†ç–略,并使用自定义评分函数。请å‚阅我们的 :ref:`User Guide <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) # 默认为 5 折交å‰éªŒè¯ >>> result['test_score'] # r_squared å¾—åˆ†é«˜æ˜¯å› ä¸ºæ•°æ®é›†ç®€å• array([1., 1., 1., 1., 1.]) è‡ªåŠ¨å‚æ•°æœç´¢ ------------ æ‰€æœ‰ä¼°è®¡å™¨éƒ½æœ‰å‚æ•°ï¼ˆåœ¨æ–‡çŒ®ä¸é€šå¸¸ç§°ä¸ºè¶…傿•°ï¼‰ï¼Œè¿™äº›å‚æ•°å¯ä»¥è¿›è¡Œè°ƒæ•´ã€‚估计器的泛化能力通常在很大程度上å–å†³äºŽå°‘æ•°å‡ ä¸ªå‚æ•°ã€‚例如,:class:`~sklearn.ensemble.RandomForestRegressor` 有一个 ``n_estimators`` 傿•°ï¼Œç”¨äºŽç¡®å®šæ£®æž—ä¸çš„æ ‘的数é‡ï¼Œè¿˜æœ‰ä¸€ä¸ª ``max_depth`` 傿•°ï¼Œç”¨äºŽç¡®å®šæ¯æ£µæ ‘çš„æœ€å¤§æ·±åº¦ã€‚é€šå¸¸ï¼Œè¿™äº›å‚æ•°çš„ç¡®åˆ‡å€¼å¹¶ä¸æ¸…æ¥šï¼Œå› ä¸ºå®ƒä»¬å–决于手头的数æ®ã€‚ ``Scikit-learn`` æä¾›äº†å·¥å…·æ¥è‡ªåŠ¨æ‰¾åˆ°æœ€ä½³çš„å‚æ•°ç»„åˆï¼ˆé€šè¿‡äº¤å‰éªŒè¯ï¼‰ã€‚在以下示例ä¸ï¼Œæˆ‘ä»¬éšæœºæœç´¢éšæœºæ£®æž—çš„å‚æ•°ç©ºé—´ï¼Œä½¿ç”¨ :class:`~sklearn.model_selection.RandomizedSearchCV` 对象。当æœç´¢ç»“æŸæ—¶ï¼Œ :class:`~sklearn.model_selection.RandomizedSearchCV` 的行为就åƒä¸€ä¸ªå·²ç»æ‹Ÿåˆäº†æœ€ä½³å‚数集的 :class:`~sklearn.ensemble.RandomForestRegressor` 。更多详细信æ¯è¯·å‚阅 :ref:`User Guide <grid_search>` :: >>> 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': ..., 'n_estimators': ...}, random_state=0) >>> search.best_params_ {'max_depth': 9, 'n_estimators': 4} >>> # 现在 search 对象表现得åƒä¸€ä¸ªæ™®é€šçš„éšæœºæ£®æž—估计器 >>> # 具有 max_depth=9 å’Œ n_estimators=4 >>> search.score(X_test, y_test) 0.73... .. note:: 在实践ä¸ï¼Œä½ å‡ ä¹Žæ€»æ˜¯å¸Œæœ›å¯¹ä¸€ä¸ªç®¡é“(pipeline)进行æœç´¢ï¼Œè€Œä¸æ˜¯å•个估计器。主è¦åŽŸå› ä¹‹ä¸€æ˜¯ï¼Œå¦‚æžœä½ å¯¹æ•´ä¸ªæ•°æ®é›†åº”ç”¨é¢„å¤„ç†æ¥éª¤è€Œä¸ä½¿ç”¨ç®¡é“,然åŽè¿›è¡Œä»»ä½•å½¢å¼çš„交å‰éªŒè¯ï¼Œä½ å°†ç ´åè®ç»ƒæ•°æ®å’Œæµ‹è¯•æ•°æ®ä¹‹é—´ç‹¬ç«‹æ€§çš„基本å‡è®¾ã€‚å®žé™…ä¸Šï¼Œç”±äºŽä½ ä½¿ç”¨æ•´ä¸ªæ•°æ®é›†å¯¹æ•°æ®è¿›è¡Œäº†é¢„处ç†ï¼Œä¸€äº›å…³äºŽæµ‹è¯•集的信æ¯å·²ç»å¯¹è®ç»ƒé›†å¯ç”¨ã€‚è¿™å°†å¯¼è‡´è¿‡é«˜ä¼°è®¡ä¼°è®¡å™¨çš„æ³›åŒ–èƒ½åŠ›ï¼ˆä½ å¯ä»¥åœ¨ `Kaggle post <https://www.kaggle.com/alexisbcook/data-leakage>`_ ä¸äº†è§£æ›´å¤šä¿¡æ¯ï¼‰ã€‚ 使用管é“进行交å‰éªŒè¯å’Œæœç´¢å°†å¤§å¤§é¿å…è¿™ç§å¸¸è§é™·é˜±ã€‚ ä¸‹ä¸€æ¥ ------ 我们已ç»ç®€è¦ä»‹ç»äº†ä¼°è®¡å™¨æ‹Ÿåˆå’Œé¢„测ã€é¢„å¤„ç†æ¥éª¤ã€ç®¡é“ã€äº¤å‰éªŒè¯å·¥å…·å’Œè‡ªåŠ¨è¶…å‚æ•°æœç´¢ã€‚本指å—应该让您对库的一些主è¦åŠŸèƒ½æœ‰ä¸€ä¸ªæ¦‚è§ˆï¼Œä½† ``scikit-learn`` è¿˜æœ‰æ›´å¤šå†…å®¹ï¼ è¯·å‚阅我们的 :ref:`用户指å—` ä»¥èŽ·å–æˆ‘们æä¾›çš„æ‰€æœ‰å·¥å…·çš„详细信æ¯ã€‚您还å¯ä»¥åœ¨ :ref:`APIå‚考` 䏿‰¾åˆ°å…¬å…±API的详尽列表。 您还å¯ä»¥æŸ¥çœ‹æˆ‘们众多的 :ref:`示例 <general_examples>`,这些示例在许多ä¸åŒçš„上下文ä¸å±•示了``scikit-learn``的使用。