Python でパイプラインを作成する
この記事では、sklearn データセットとカスタムデータセットの機械学習用の Python パイプラインの作成について説明します。
カスタムデータセット用に Python でパイプラインを作成する
Python パイプラインを作成するには 2つのインポートパッケージが必要です。データフレームを生成するための Pandas とパイプライン用の sklearn です。これに加えて、パイプラインと線形回帰という 2つのサブパッケージを展開します。
以下は、使用されているすべてのパッケージのリストです。
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]])
データをトレーニングセットとテストセットに分割
すべての機械学習モデルでは、データを 2つの等しくない半分に分割する必要があります。分離した後、これら 2つのセットを使用して、モデルのトレーニングとテストを行います。
より重要な部分はトレーニングに使用され、もう 1つはモデルのテストに使用されます。
以下のコードスニペットでは、最初の 8つの値はモデルのトレーニングに使用され、残りの値はモデルのテストに使用されます。
learn = df.iloc[:8]
evaluate = df.iloc[8:]
scikit-learn パイプラインは、パイプラインに値を取り込んで結果を出すことで機能します。値は、X と y の 2つの入力変数を介して提供されます。
使用される方程式では、c は a と b の関数です。したがって、パイプラインを線形回帰モデルの値に適合させるために、a、b の値を X に、C 言語の値を y に転送します。
X と y は変数を学習し、評価していることに注意することが重要です。したがって、変数 a と b を train 関数に転送し、変数 c を test 関数に割り当てます。
learn_X = learn.drop("col3", axis=1)
learn_y = learn.col3
evaluate_X = evaluate.drop("col3", axis=1)
evaluate_y = evaluate.col3
上記のコードでは、Pandas の drop()
関数は、値が learn_X
変数に入力されると、列 c の値を削除します。learn_y
変数では、列 c の値が転送されます。
axis = 1
は列を表し、0 の値は行を表します。
Python パイプラインを作成し、それに値を適合させる
Pipeline 関数を使用して Python でパイプラインを作成します。使用する前に変数に保存する必要があります。
ここでは、この目的のために rock
という名前の変数が宣言されています。
パイプライン内で、その名前と使用するモデルを指定する必要があります-('線形回帰のモデル'、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
ご覧のとおり、パイプラインは正確な値を予測します。
Scikit-Learn データセット用の Python でパイプラインを作成する
この例は、Scikit 学習データセット用に Python でパイプラインを作成する方法を示しています。大きなデータセットでパイプライン操作を実行することは、小さなデータセットとは少し異なります。
パイプラインは、大規模なデータセットを処理するときに、追加のモデルを使用してデータをクリーンアップおよびフィルタリングする必要があります。
以下は、必要なインポートパッケージです。
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 のデータセットが使用されます。複数の列と値がありますが、具体的にはデータとターゲットの 2つの列を使用します。
データセットをロードしてトレインセットとテストセットに分割する
データセットを変数 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_learn
、X_evaluate
、y_learn
、および y_evaluate
)に割り当てます。前のプログラムとは異なり、ここでは、割り当ては train_test_split()
関数を介して行われます。
test_size=0.4
は、データセットの 40%をテスト用に予約し、残りの半分をトレーニング用に保持するように関数に指示します。
random_state=1
は、データセットの分割が均一に行われることを保証し、関数が実行されるたびに予測が同じ出力を提供するようにします。random_state=0
は、関数が実行されるたびに異なる結果を提供します。
stratify=y
は、パラメーターを階層化するために提供されるのと同じデータサイズがサンプルサイズで使用されることを保証します。1 の 15%と 0 の 85%がある場合、stratify
は、すべてのランダム分割でシステムに 1 の 15%と 0 の 85%があることを保証します。
Python パイプラインを作成し、それに値を適合させる
pipeline = make_pipeline(StandardScaler(),
RandomForestClassifier (n_estimators=10, max_features=5, max_depth=2, random_state=1))
ここで:
make_pipeline()
は、パイプラインを作成するための Scikit-learn 関数です。標準 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