データ準備の最も一般的なアプローチは、データセットを調査し、機械学習アルゴリズムの期待値を確認し、最も適切なデータ準備手法を慎重に選択して、生データをアルゴリズムの期待値に最も合うように変換することです。時間がかかり、費用がかかり、多くの専門知識が必要です。 データ準備のもう 1 つのアプローチは、一般的で頻繁に使用される一連のデータ準備手法を生データに並行して適用し、すべての変換の結果を 1 つの大きなデータ セットにマージして、モデルを適合および評価できるようにすることです。 これは、データ変換を生データから顕著な特徴を抽出し、それによって問題の構造を学習アルゴリズムに公開する方法と見なすデータ準備に代わる考え方です。入力特徴にスケーラブルに重み付けし、予測対象のターゲットに最も関連性の高い特徴を使用するアルゴリズムを学習する必要があります。 このアプローチでは専門知識があまり必要ありません。また、データ準備方法の完全なグリッド検索に比べて計算効率が高く、特定の予測モデリング問題に対して優れたパフォーマンスまたは最高のパフォーマンスを実現する直感的でないデータ準備ソリューションを発見するのに役立ちます。 [[332888]]この記事では、特徴抽出を使用して表形式データのデータ準備を行う方法について説明します。 特徴抽出は、表形式データのデータ準備に対する代替アプローチを提供します。このアプローチでは、すべてのデータ変換が生の入力データに並行して適用され、結合されて 1 つの大きなデータセットが作成されます。 標準分類データセットのベンチマーク パフォーマンスを向上させるために、データ準備に特徴抽出方法を使用する方法。 。 標準データセットでのモデリング パフォーマンスをさらに向上させるために、特徴抽出モデリング パイプラインに特徴選択を追加する方法。 この記事は3つの部分に分かれています。 1. 特徴抽出技術のためのデータ準備 2. データセットとパフォーマンスベンチマーク - ワイン分類データセット
- ベースラインモデルのパフォーマンス
3. データ準備のための特徴抽出法 特徴抽出技術のためのデータ準備 データの準備は難しい場合があります。 最も一般的に使用され、採用されているアプローチは、データセットを分析し、アルゴリズムの要件を調べ、アルゴリズムの期待に最も合うように生データを変換することです。 これは効果的ですが、時間がかかり、データ分析と機械学習アルゴリズムの専門知識が必要になる場合があります。 もう 1 つのアプローチは、入力変数の準備をモデリング パイプラインのハイパーパラメータとして考慮し、アルゴリズムとアルゴリズム構成を選択するときに調整することです。 計算コストが高くなる可能性もありますが、直感に反するソリューションを明らかにする効果的な方法にもなり、専門知識をほとんど必要としません。 これら 2 つのデータ準備アプローチのバランスをとる方法は、入力データの変換を特徴エンジニアリングまたは特徴抽出プロセスとして捉えることです。これには、生データに一般的な、または一般的に使用される一連のデータ準備手法を適用し、すべての機能を集約して大規模なデータセットを作成し、そのデータにモデルを適合させて評価することが含まれます。 このアプローチの原理では、各データ準備手法を、生データから顕著な特徴を抽出して学習アルゴリズムに提示できる変換と見なします。理想的には、このような変換により、複雑な関係と複合入力変数が分離され、線形機械学習技術などのより単純なモデリング アルゴリズムを使用できるようになります。 適切な名前がないため、予測モデリング プロジェクトのデータ準備を構成するための方法を「特徴エンジニアリング手法」または「特徴抽出手法」と呼ぶことにします。 これにより、データ準備方法の選択においてデータ分析とアルゴリズムの専門知識を活用できるようになり、直感的ではないものの、計算コストがはるかに低いソリューションを見つけることができます。 入力特徴の数の除外は、抽出された多数の特徴の重要性または価値をランク付けし、予測ターゲットに最も関連性の高い少数の変数のみを選択する特徴選択技術を使用することによって、明示的に対処することもできます。 このデータ準備アプローチを実際の例で詳しく見てみましょう。 例に進む前に、まず標準データセットを選択し、パフォーマンス ベンチマークを作成しましょう。 データセットとパフォーマンスベンチマーク まず、標準的な機械学習データセットを選択し、このデータセットのパフォーマンス ベンチマークを確立します。これにより、データ準備のための特徴抽出方法を検討するためのコンテキストが提供されます。 ワイン分類データセット ワイン分類データセットを使用します。 このデータセットには、ワインのサンプルの化学組成を記述する 13 個の入力変数があり、ワインを 3 つのタイプのいずれかに分類する必要があります。 この例では、データセットを読み込み、それを入力列と出力列に分割し、データ配列を要約します。 - #ワインデータセットの読み込みと要約の例
- pandasからread_csvをインポートする
- #データセットの場所を定義する
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'
- #データセットをデータフレームとしてロードする
- df = read_csv(url, ヘッダー=なし)
- # numpy配列を取得する
- データ = df.values
- # 列を入力と 出力変数
- X, y = データ[:, :-1], データ[:, -1]
- #読み込まれたデータの形状を要約する
- print(X.shape, y.shape)
- #(178, 13) (178,)
例を実行すると、データセットが正しくロードされ、13 個の入力変数と 1 つのターゲット変数を持つ 179 行のデータがあることがわかります。 次に、このデータセットでモデルを評価し、パフォーマンスのベースラインを確立しましょう。 ベースラインモデルのパフォーマンス 生の入力データでモデルを評価することで、ワイン分類タスクのパフォーマンス ベースラインを確立できます。 この場合は、ロジスティック回帰モデルを評価します。 まず、scikit-learn ライブラリで期待されるように、入力変数が数値であり、ターゲット変数がラベルでエンコードされていることを確認することで、最小限のデータ準備を実行できます。 - #データセットを最低限準備する
- X = X.astype( 'float' )
- y = ラベルエンコーダ().fit_transform(y.astype( 'str' ))
次に、予測モデルを定義します。 - # モデルを定義する
- モデル = LogisticRegression(ソルバー = 'liblinear' )
標準的な反復層別 k 分割交差検証 (10 回の複製と 3 回の繰り返し) を使用してモデルを評価します。 モデルのパフォーマンスは分類精度を使用して評価されます。 - モデル = LogisticRegression(ソルバー = 'liblinear' )
- #クロスバリデーション手順を定義する
- cv = RepeatedStratifiedKFold(n_splits=10、n_repeats=3、ランダム状態=1)
- # モデルを評価する
- スコア = cross_val_score(モデル、X、y、スコアリング= '精度' 、cv=cv、n_jobs=-1)
実行の最後に、すべての複製と評価フォールドにわたって収集された精度スコアの平均と標準偏差を報告します。 - # レポートのパフォーマンス
- print( '精度: %.3f (%.3f)' % (平均(スコア), 標準偏差(スコア)))
すべてをまとめると、生ワイン分類データセットでロジスティック回帰モデルを評価する完全な例がここにあります。 - #ワインデータセットにおけるベースラインモデルのパフォーマンス
- numpyからの平均をインポート
- numpyからstdをインポート
- pandasからread_csvをインポートする
- sklearn.preprocessingからLabelEncoder をインポートします
- sklearn.model_selectionからRepeatedStratifiedKFold をインポートします
- sklearn.model_selectionからcross_val_score をインポートします
- sklearn.linear_modelからLogisticRegression をインポートします
- #データセットをロードする
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'
- df = read_csv(url, ヘッダー=なし)
- データ = df.values
- X, y = データ[:, :-1], データ[:, -1]
- #データセットを最低限準備する
- X = X.astype( 'float' )
- y = ラベルエンコーダ().fit_transform(y.astype( 'str' ))
- # モデルを定義する
- モデル = LogisticRegression(ソルバー = 'liblinear' )
- #クロスバリデーション手順を定義する
- cv = RepeatedStratifiedKFold(n_splits=10、n_repeats=3、ランダム状態=1)
- # モデルを評価する
- スコア = cross_val_score(モデル、X、y、スコアリング= '精度' 、cv=cv、n_jobs=-1)
- # レポートのパフォーマンス
- print( '精度: %.3f (%.3f)' % (平均(スコア), 標準偏差(スコア)))
-
- #精度: 0.953 (0.048)
例を実行すると、モデルのパフォーマンスが評価され、平均と標準偏差の分類精度が報告されます。 学習アルゴリズムの確率的性質、評価手順、およびマシン間の精度の違いにより、結果は異なる場合があります。例を数回実行してみてください。 この場合、ロジスティック回帰モデルを元の入力データに適合させることで、平均分類精度が約 95.3% に達し、パフォーマンスのベースラインが提供されることがわかります。 次に、特徴抽出ベースのデータ準備アプローチを使用するとパフォーマンスが向上するかどうかを検討してみましょう。 データ準備のための特徴抽出法 最初のステップは、一般的でよく使用されるデータ準備手法のセットを選択することです。 この場合、入力変数が数値であると仮定して、MinMaxScaler、StandardScaler、RobustScaler などの入力変数のスケールを変更する一連の変換と、QuantileTransformer や KBinsDiscretizer などの入力変数の分布をリンクする変換を使用します。最後に、PCA や TruncatedSVD などの入力変数間の線形依存関係を削除する変換も使用します。 FeatureUnion クラスを使用すると、実行する変換のリストを定義し、その結果をまとめて集約することができます。これにより、多数の列を持つ新しいデータセットが作成されます。 列の数の推定値は、13 個の入力変数に 5 個の変換を掛けたもの、または 65 個に PCA および SVD 次元削減方法から出力される 14 個の列を加えたもので、合計で約 79 個の機能になります。 - #特徴結合の変換
- 変換 = リスト()
- 変換を追加します(( 'mms' , MinMaxScaler()))
- 変換を追加します(( 'ss' , StandardScaler()))
- 変換を追加します(( 'rs' , RobustScaler()))
- transforms.append(( 'qt' , QuantileTransformer(n_quantiles=100, output_distribution= 'normal' )))
- transforms.append(( 'kbd' , KBinsDiscretizer(n_bins=10, encode= 'ordinal' , strategy= 'uniform' )))
- 変換を追加します(( 'pca' , PCA(n_components=7)))
- transforms.append(( 'svd' , TruncatedSVD(n_components=7)))
- #フィーチャーユニオンを作成する
- fu = FeatureUnion(変換)
次に、最初のステップとして FeatureUnion を使用し、最後のステップとしてロジスティック回帰モデルを使用してモデリング パイプラインを作成します。 - # モデルを定義する
- モデル = LogisticRegression(ソルバー = 'liblinear' )
- # パイプラインを定義する
- ステップ = リスト()
- ステップを追加します(( 'fu' , fu))
- ステップを追加します(( 'm' , モデル))
- パイプライン = パイプライン(ステップ = ステップ)
その後、パイプラインは、以前と同様に、繰り返し層別 k 分割交差検証を使用して評価できます。 完全な例を以下に示します。 - #ワインデータセットの特徴エンジニアリングとしてのデータ準備
- numpyからの平均をインポート
- numpyからstdをインポート
- pandasからread_csvをインポートする
- sklearn.model_selectionからRepeatedStratifiedKFold をインポートします
- sklearn.model_selectionからcross_val_score をインポートします
- sklearn.linear_modelからLogisticRegression をインポートします
- sklearn.pipelineからパイプラインをインポートします
- sklearn.pipelineからFeatureUnion をインポートします
- sklearn.preprocessingからLabelEncoder をインポートします
- sklearn.preprocessingからMinMaxScaler をインポートします
- sklearn.preprocessingからStandardScaler をインポートします
- sklearn.preprocessingからRobustScaler をインポートします
- sklearn.preprocessingからQuantileTransformer をインポートします
- sklearn.preprocessingからKBinsDiscretizer をインポートします
- sklearn.decompositionからPCA をインポート
- sklearn.decompositionからTruncatedSVD をインポートします
- #データセットをロードする
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'
- df = read_csv(url, ヘッダー=なし)
- データ = df.values
- X, y = データ[:, :-1], データ[:, -1]
- #データセットを最低限準備する
- X = X.astype( 'float' )
- y = ラベルエンコーダ().fit_transform(y.astype( 'str' ))
- #特徴結合の変換
- 変換 = リスト()
- 変換を追加します(( 'mms' , MinMaxScaler()))
- 変換を追加します(( 'ss' , StandardScaler()))
- 変換を追加します(( 'rs' , RobustScaler()))
- transforms.append(( 'qt' , QuantileTransformer(n_quantiles=100, output_distribution= 'normal' )))
- transforms.append(( 'kbd' , KBinsDiscretizer(n_bins=10, encode= 'ordinal' , strategy= 'uniform' )))
- 変換を追加します(( 'pca' , PCA(n_components=7)))
- transforms.append(( 'svd' , TruncatedSVD(n_components=7)))
- #フィーチャーユニオンを作成する
- fu = FeatureUnion(変換)
- # モデルを定義する
- モデル = LogisticRegression(ソルバー = 'liblinear' )
- # パイプラインを定義する
- ステップ = リスト()
- ステップを追加します(( 'fu' , fu))
- ステップを追加します(( 'm' , モデル))
- パイプライン = パイプライン(ステップ = ステップ)
- #クロスバリデーション手順を定義する
- cv = RepeatedStratifiedKFold(n_splits=10、n_repeats=3、ランダム状態=1)
- # モデルを評価する
- スコア = cross_val_score(パイプライン、X、y、スコアリング = '精度' 、cv = cv、n_jobs = -1)
- # レポートのパフォーマンス
- print( '精度: %.3f (%.3f)' % (平均(スコア), 標準偏差(スコア)))
- #精度: 0.968 (0.037)
例を実行すると、モデルのパフォーマンスが評価され、平均と標準偏差の分類精度が報告されます。 学習アルゴリズムの確率的性質、評価手順、およびマシン間の精度の違いにより、結果は異なる場合があります。例を数回実行してみてください。 この場合、パフォーマンスがベースラインよりも向上し、平均分類精度が約 96.8% に達したことがわかります。 FeatureUnion にデータ準備メソッドを追加して、パフォーマンスが向上するかどうかを確認してください。 また、特徴選択を使用して、抽出された約 80 個の特徴を、モデルに最も関連性の高い特徴のサブセットに減らすこともできます。モデルの複雑さを軽減するだけでなく、無関係で冗長な入力機能を削除することでパフォーマンスを向上させることもできます。 この場合、特徴選択に再帰的特徴除去 (RFE) 手法を使用し、最も関連性の高い 15 個の特徴を選択するように構成します。 - # 特徴選択を定義する
- rfe = RFE(推定器=LogisticRegression(ソルバー= 'liblinear' )、選択するn_features_to_select=15)
次に、FeatureUnion アルゴリズムの後、LogisticRegression アルゴリズムの前に、RFE 機能選択をモデリング パイプラインに追加できます。 - # パイプラインを定義する
- ステップ = リスト()
- ステップを追加します(( 'fu' , fu))
- ステップを追加します(( 'rfe' , rfe))
- ステップを追加します(( 'm' , モデル))
- パイプライン = パイプライン(ステップ = ステップ)
これらすべてをまとめると、特徴選択のための特徴選択データ準備方法の完全な例が以下に示されます。 - #ワインデータセットの特徴選択による特徴エンジニアリングとしてのデータ準備
- numpyからの平均をインポート
- numpyからstdをインポート
- pandasからread_csvをインポートする
- sklearn.model_selectionからRepeatedStratifiedKFold をインポートします
- sklearn.model_selectionからcross_val_score をインポートします
- sklearn.linear_modelからLogisticRegression をインポートします
- sklearn.pipelineからパイプラインをインポートします
- sklearn.pipelineからFeatureUnion をインポートします
- sklearn.preprocessingからLabelEncoder をインポートします
- sklearn.preprocessingからMinMaxScaler をインポートします
- sklearn.preprocessingからStandardScaler をインポートします
- sklearn.preprocessingからRobustScaler をインポートします
- sklearn.preprocessingからQuantileTransformer をインポートします
- sklearn.preprocessingからKBinsDiscretizer をインポートします
- sklearn.feature_selectionからRFEをインポート
- sklearn.decompositionからPCA をインポート
- sklearn.decompositionからTruncatedSVD をインポートします
- #データセットをロードする
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'
- df = read_csv(url, ヘッダー=なし)
- データ = df.values
- X, y = データ[:, :-1], データ[:, -1]
- #データセットを最低限準備する
- X = X.astype( 'float' )
- y = ラベルエンコーダ().fit_transform(y.astype( 'str' ))
- #特徴結合の変換
- 変換 = リスト()
- 変換を追加します(( 'mms' , MinMaxScaler()))
- 変換を追加します(( 'ss' , StandardScaler()))
- 変換を追加します(( 'rs' , RobustScaler()))
- transforms.append(( 'qt' , QuantileTransformer(n_quantiles=100, output_distribution= 'normal' )))
- transforms.append(( 'kbd' , KBinsDiscretizer(n_bins=10, encode= 'ordinal' , strategy= 'uniform' )))
- 変換を追加します(( 'pca' , PCA(n_components=7)))
- transforms.append(( 'svd' , TruncatedSVD(n_components=7)))
- #フィーチャーユニオンを作成する
- fu = FeatureUnion(変換)
- # 特徴選択を定義する
- rfe = RFE(推定器=LogisticRegression(ソルバー= 'liblinear' )、選択するn_features_to_select=15)
- # モデルを定義する
- モデル = LogisticRegression(ソルバー = 'liblinear' )
- # パイプラインを定義する
- ステップ = リスト()
- ステップを追加します(( 'fu' , fu))
- ステップを追加します(( 'rfe' , rfe))
- ステップを追加します(( 'm' , モデル))
- パイプライン = パイプライン(ステップ = ステップ)
- #クロスバリデーション手順を定義する
- cv = RepeatedStratifiedKFold(n_splits=10、n_repeats=3、ランダム状態=1)
- # モデルを評価する
- スコア = cross_val_score(パイプライン、X、y、スコアリング = '精度' 、cv = cv、n_jobs = -1)
- # レポートのパフォーマンス
- print( '精度: %.3f (%.3f)' % (平均(スコア), 標準偏差(スコア)))
- #精度: 0.989 (0.022)
例を実行してモデルのパフォーマンスを評価し、平均と標準偏差の分類精度を報告します。 学習アルゴリズムの確率的性質、評価プロセス、およびマシン間の精度の違いにより、結果が異なる場合があります。この例を数回実行してみてください。 ここでも、すべての特徴を抽出した場合の 96.8% から、モデリング前に特徴選択を使用した場合の 98.9% へと、パフォーマンスがさらに向上していることがわかります。 |