Pythonとsklearnを使って機械学習パイプラインを実装する方法

スポンサーリンク

この記事では、Pythonのパイプラインについて説明します。

機械学習の応用では、典型的な処理というものがあります。

それらはテスト設定におけるデータリークのような問題を解決するため、標準的なものです。

パイプラインは、機械学習操作をオーケストレーションするためのPythonのscikit-learnユーティリティです。

パイプラインは、一連のデータ変換を線形につなげ、測定可能なモデリングプロセスを実現することで機能します。

その目的は、トレーニングデータセットやクロスバリデーション手法に関わる各フォールドなど、パイプラインのすべてのフェーズが、評価に利用できるデータに限定されることを保証することです。

Pythonによるパイプラインのためのデータ準備とモデリング

トレーニングデータセットからテストデータセットへのデータリークは、機械学習やデータサイエンスにおいてよくある落とし穴です。

この罠にはまらないためには、学習とテストを明確に分離した信頼性の高いテストハーネスが必要です。

データ準備とは、アルゴリズムがトレーニングデータセット全体へのアクセスを獲得するための、とてもシンプルなアプローチです。

例えば、学習前にトレーニングデータセット全体を正規化または標準化すると、テストセットのデータの規模がトレーニングデータセットに影響を与えるため、適切なテストとは言えません。

パイプラインは、正規化などのデータ準備がクロスバリデーションの各フォールドに限定されることを保証し、テストハーネス内のデータリークを最小化します。

この重要なデータ準備とモデル評価の方法は、以下の例で示されています。

パイプラインには2つのステップがあります。

  • データが一様であることを確認します。
  • Linear Discriminant Analysis モデルの使用方法を理解します。

pythonでパイプラインを作成し、その中でデータセットをどのように学習させるかを理解しましょう。

スポンサーリンク

ライブラリのインポート

パイプラインを作成するには、たくさんのインポートパッケージをシステムに読み込む必要があります。

これらのPythonパッケージをプログラムで使用するためには、事前にインストールし、設定する必要があることを忘れないでください。

from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.pipeline import FeatureUnion

データを読み込む

この例では、糖尿病に苦しむ人々の情報を含むパブリックドメインからデータを取得する予定です。

このデータベースはパイプラインの学習に使用します。

以下のコードは、パブリックドメインのレコードをどのように読み込むかを示しています。

url_data = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
varnames = ['var_preg', 'var_plas', 'var_pres', 'var_skin', 'var_test', 'var_mass', 'var_pedi', 'var_age', 'var_class']
vardataframe = read_csv(url_data, names=varnames)
vararray = vardataframe.values
varX = vararray[:,0:8]
varY = vararray[:,8]

Pythonでパイプラインを作成する

urlfeatures = []
urlfeatures.append(('pca', PCA(n_components=3)))
urlfeatures.append(('select_best', SelectKBest(k=6)))
feature_union = FeatureUnion(urlfeatures)
# Here, pipeline is created
estimators = []
estimators.append(('feature_union', feature_union))
estimators.append(('logistic', LogisticRegression()))
model = Pipeline(estimators)
# The pipelie is tested here
seed = 7
varkfold = KFold(n_splits=10)
dataresults = cross_val_score(model, varX, varY, cv=varkfold)
print(dataresults.mean())

Pythonによるパイプラインの完全な実装

Pythonによるパイプラインの完全実装は以下の通りです。

# Create a pipeline that extracts features from the data then creates a model
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.pipeline import FeatureUnion
 
# data laoded into global variables
url_data = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
varnames = ['var_preg', 'var_plas', 'var_pres', 'var_skin', 'var_test', 'var_mass', 'var_pedi', 'var_age', 'var_class']
vardataframe = read_csv(url_data, names=varnames)
vararray = vardataframe.values
varX = vararray[:,0:8]
varY = vararray[:,8]
 
# creating feature union
urlfeatures = []
urlfeatures.append(('pca', PCA(n_components=3)))
urlfeatures.append(('select_best', SelectKBest(k=6)))
feature_union = FeatureUnion(urlfeatures)
 
# Here, pipeline is created
estimators = []
estimators.append(('feature_union', feature_union))
estimators.append(('logistic', LogisticRegression()))
model = Pipeline(estimators)
 
# The pipelie is tested here
seed = 7
varkfold = KFold(n_splits=10)
dataresults = cross_val_score(model, varX, varY, cv=varkfold)
print(dataresults.mean())

出力

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier
# database is imported from inbuilt sklearn datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
 
#The data spliting is executed here
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.50)
# importing pipes for making the Pipe flow
from sklearn.pipeline import Pipeline
# The sequence of pipe flow is :
# PCA dimension is reduced by 2 >> Data gets scaled >> Classification of decission tree
pipe = Pipeline([('pca', PCA(n_components = 2)), ('std', StandardScaler()), ('decision_tree', DecisionTreeClassifier())], verbose = True)
 
# fitting the data in the pipeline
pipe.fit(X_train, y_train)
 
# scoring data
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, pipe.predict(X_test)))

パイプラインテストをよりよく理解するために、別の例を見てみましょう。

以下のコードでは、虹彩データベースがテストパイプラインにロードされています。

虹彩データベースは、sklearn がテストパイプラインに提供するデータベースの分類です。

この例では、1つのデータベースを半分に分割して、パイプラインのトレーニングとテストの両方に使用しています。

pipleline_output.png

出力

pipeline_flow.png

まとめ

この記事では、パイプラインとそれがどのようにテストされ、トレーニングされるのかについて学びました。

また、sklearn import パッケージについて、そのデータベースと関数がデータテストのためのパイプラインの作成にどのように役立つかを学びました。

さらに、パブリックドメインのレコードをパイプラインの学習に使用する方法を学び、sklearn の内蔵データベースをテストとトレーニングの両方のデータを提供するために分割する方法も観察しました。

タイトルとURLをコピーしました