在 Python 中建立管道

Jay Shaw 2023年10月10日
  1. 在 Python 中為自定義資料集建立管道
  2. 在 Python 中為 Scikit-Learn 資料集建立管道
在 Python 中建立管道

本文將演示為 sklearn 資料集和自定義資料集建立用於機器學習的 Python 管道。

在 Python 中為自定義資料集建立管道

我們需要兩個匯入包來建立 Python 管道,Pandas 用於生成 DataFrame,sklearn 用於管道。除此之外,我們還部署了另外兩個子包,Pipeline 和 Linear Regression。

以下是使用的所有軟體包的列表。

import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression

形成具有方程值的資料集

該程式旨在建立一個管道,當有足夠的後續值訓練模型時,該管道將預測方程的結果值。

這裡使用的等式是:

c = a + 3*\sqrt[3]{b}

我們使用線性方程的值建立一個 Pandas 資料集。

df = pd.DataFrame(columns=["col1", "col2", "col3"], val=[[15, 8, 21], [16, 27, 25]])

將資料拆分為訓練集和測試集

每個機器學習模型都需要將資料分成不等的兩半。分離後,我們使用這兩組來訓練和測試模型。

比較顯著的部分用於訓練,另一部分用於測試模型。

在下面的程式碼片段中,前 8 個值用於訓練模型,其餘用於測試。

learn = df.iloc[:8]
evaluate = df.iloc[8:]

scikit-learn 管道通過將值輸入管道然後給出結果來工作。值通過兩個輸入變數 - X 和 y 提供。

在所使用的等式中,c 是 a 和 b 的函式。因此,為了使管道適合線性迴歸模型中的值,我們將 a、b 值轉換為 X 值和 y 中的 c 值。

重要的是要注意 X 和 y 是學習和評估變數。因此,我們將變數 a 和 b 傳遞給訓練函式,並將變數 c 分配給測試函式。

learn_X = learn.drop("col3", axis=1)
learn_y = learn.col3

evaluate_X = evaluate.drop("col3", axis=1)
evaluate_y = evaluate.col3

在上面的程式碼中,當值被輸入到 learn_X 變數中時,Pandas drop() 函式會刪除列 c 的值。在 learn_y 變數中,傳輸 c 列的值。

axis = 1 代表列,而 0 值代表行。

建立 Python 管道並在其中擬合值

我們使用 Pipeline 函式在 Python 中建立一個管道。我們必須在使用前將其儲存在變數中。

在這裡,為此目的宣告瞭一個名為 rock 的變數。

在管道內部,我們必須給出它的名稱和要使用的模型 - ('Model for Linear Regression', LinearRegression())

rock = Pipeline(steps=[("Model for Linear Regression", LinearRegression())])

完成在 Python 中建立管道的步驟後,需要為其擬合學習值,以便線性模型可以使用提供的值訓練管道。

rock.fit(learn_X, learn_y)

管道訓練完成後,變數 evaluate_X 通過 pipe1.predict() 函式預測以下值。

預測值儲存在一個新變數 evalve 中並列印出來。

evalve = rock.predict(evaluate_X)
print(f"\n{evalve}")

讓我們把所有東西放在一起來觀察管道是如何建立的以及它的效能。

import pandas as pd

# import warnings
# warnings.filterwarnings('ignore')

from sklearn.pipeline import Pipeline

from sklearn.linear_model import LinearRegression

df = pd.DataFrame(
    columns=["col1", "col2", "col3"],
    data=[
        [15, 8, 21],
        [16, 27, 25],
        [17, 64, 29],
        [18, 125, 33],
        [19, 216, 37],
        [20, 343, 41],
        [21, 512, 45],
        [22, 729, 49],
        [23, 1000, 53],
        [24, 1331, 57],
        [25, 1728, 61],
        [26, 2197, 65],
    ],
)

learn = df.iloc[:8]
evaluate = df.iloc[8:]

learn_X = learn.drop("col3", axis=1)
learn_y = learn.col3

evaluate_X = evaluate.drop("col3", axis=1)
evaluate_y = evaluate.col3

print("\n step: Here, the pipeline is formed")
rock = Pipeline(steps=[("Model for Linear Regression", LinearRegression())])
print("\n Step: Fitting the data inside")
rock.fit(learn_X, learn_y)
print("\n Searching for outcomes after evaluation")
evalve = rock.predict(evaluate_X)
print(f"\n{evalve}")

輸出:

"C:/Users/Win 10/pipe.py"

 step: Here, the pipeline is formed

 Step: Fitting the data inside

 Searching for outcomes after evaluation

[53. 57. 61. 65.]

Process finished with exit code 0

正如我們所看到的,管道預測了確切的值。

在 Python 中為 Scikit-Learn 資料集建立管道

此示例演示如何在 Python 中為 Scikit 學習資料集建立管道。在大型資料集上執行管道操作與小型資料集略有不同。

管道在處理大型資料集時需要使用額外的模型來清理和過濾資料。

下面是我們需要的匯入包。

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn import datasets

使用了來自 sklearn 的資料集。它有多個列和值,但我們將專門使用兩列 - 資料和目標。

載入資料集並將其拆分為訓練集和測試集

我們將把資料集載入到變數 bc 中,並將各個列的值儲存在變數 X 和 y 中。

bc = datasets.load_breast_cancer()
X = bc.data
y = bc.target

載入資料集後,我們定義學習和評估變數。資料集必須分成訓練集和測試集。

a_learn, a_evaluate, b_learn, b_evaluate = train_test_split(
    X, y, test_size=0.40, random_state=1, stratify=y
)

我們將資料集分配到 4 個主要變數 - X_learnX_evaluatey_learny_evaluate。與之前的程式不同,這裡的分配是通過 train_test_split() 函式完成的。

test_size=0.4 指示函式保留 40% 的資料集用於測試,剩下的一半用於訓練。

random_state=1 確保對資料集進行統一拆分,以便每次執行函式時預測都給出相同的輸出。每次執行函式時,random_state=0 都會提供不同的結果。

stratify=y 確保在樣本大小中使用相同的資料大小,如為引數分層提供的那樣。如果有 15% 的 1 和 85% 的 0,stratify 將確保系統在每次隨機拆分中都有 15% 的 1 和 85% 的 0。

建立 Python 管道並在其中擬合值

pipeline = make_pipeline(StandardScaler(),
RandomForestClassifier (n_estimators=10, max_features=5, max_depth=2, random_state=1))

其中,

  • make_pipeline() 是一個用於建立管道的 Scikit-learn 函式。
  • Standard scaler() 從平均值中刪除值並將它們分配到其單位值。
  • RandomForestClassifier() 是一個決策模型,它從資料集中獲取一些樣本值,用每個樣本值建立一個決策樹,然後預測每個決策樹的結果。然後,模型對預測結果的準確性進行投票,投票最多的結果被選為最終預測。
  • n_estimators 表示在投票前要建立的決策樹的數量。
  • max_features 決定執行節點分裂時將形成多少個隨機狀態。
  • max_depth 表示樹的節點有多深。

建立管道後,對值進行擬合,並預測結果。

pipeline.fit(a_learn, b_learn)
y_pred = pipeline.predict(a_evaluate)

讓我們看看完整的程式。

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn import datasets

bc = datasets.load_breast_cancer()
X = bc.data
y = bc.target

a_learn, a_evaluate, b_learn, b_evaluate = train_test_split(
    X, y, test_size=0.40, random_state=1, stratify=y
)

# Create the pipeline

pipeline = make_pipeline(
    StandardScaler(),
    RandomForestClassifier(
        n_estimators=10, max_features=5, max_depth=2, random_state=1
    ),
)


pipeline.fit(a_learn, b_learn)

y_pred = pipeline.predict(a_evaluate)

print(y_pred)

輸出:

"C:/Users/Win 10/test_cleaned.py"
[0 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1
 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1
 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1
 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1
 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 1 1
 1 1 1 1 1 0]

Process finished with exit code 0