paint-brush
特徴量エンジニアリングの初心者ガイドby@dotslashbit
626
626

特徴量エンジニアリングの初心者ガイド

Sahil9m2023/08/21
Read on Terminal Reader

機械学習とデータ サイエンスの領域では、特徴量エンジニアリングはモデルのパフォーマンス向上の基礎となります。アルゴリズムやモデルが脚光を浴びることが多いですが、予測力の基礎を築くのは慎重に作成された機能です。弱い基礎の上に家を建てようとしているところを想像してみてください。強力な機能がなければ、最も高度なアルゴリズムであっても、複雑なデータセットに直面すると崩れてしまう可能性があります。
featured image - 特徴量エンジニアリングの初心者ガイド
Sahil HackerNoon profile picture
0-item


機械学習とデータ サイエンスの領域では、特徴量エンジニアリングがモデルのパフォーマンス向上の基礎となります。アルゴリズムやモデルが脚光を浴びることが多いですが、予測力の基礎を築くのは慎重に作成された機能です。弱い基礎の上に家を建てようとしているところを想像してみてください。強力な機能がなければ、最も高度なアルゴリズムであっても、複雑なデータセットに直面すると崩れてしまう可能性があります。

特徴量エンジニアリングを理解する

特徴エンジニアリングは、モデルのパフォーマンスを最大化するために生データから特徴 (入力変数) を選択、変換、作成する創造的かつ戦略的なプロセスです。これは、データを実用的な洞察に変換し、正確な予測を行うために必要な文脈の理解を機械に与える技術です。住宅価格の予測、顧客の好みの分類、病状の診断など、データに隠された可能性を解き放つ鍵となるのは特徴エンジニアリングです。

丁寧なモノづくりの大切さ

さまざまな要因に基づいて住宅価格を予測する任務を負っていると想像してください。最初は、面積、寝室の数、場所などの明らかな特徴に惹かれるかもしれません。ただし、特徴量エンジニアリングの魔法は、ターゲット変数に影響を与えるより微妙な側面を明らかにすることにあります。バスルームとベッドルームの比率は価格に影響しますか?暖炉の有無や屋根の古さについてはどうですか?


特徴エンジニアリングは、単により多くの機能を作成することではありません。それは、データのどの側面が本当に重要なのかを見極めることです。このプロセスでは、多くの場合、その分野の知識、創造性、取り組んでいる問題についての深い理解が必要になります。既存の機能を改良し、新しい機能を作成することで、本質的には、専門家のようにデータを理解するようにモデルを教育することになります。

なぜ特徴量エンジニアリングに注目する必要があるのでしょうか?

答えはモデルのパフォーマンスにあります。適切に設計された機能により、トレーニング中の収束が速くなり、過剰適合が減少し、最終的には予測の精度が向上します。機械学習モデルの良さは、与えられるデータによって決まります。適切に設計された機能により、そのデータのより豊かで微妙な表現が提供されます。


この記事では、Kaggle の高度な住宅価格予測データセットを使用した特徴量エンジニアリングの世界を詳しく掘り下げていきます。これに従うことで、生データを貴重な予測変数に変換できるさまざまな手法についての洞察が得られ、さまざまな特徴量エンジニアリング手法を適用することでモデルの結果がどのように改善されるかがわかります。


したがって、時間を無駄にすることなく、特徴量エンジニアリングのさまざまな方法について学び始めましょう。

メソッド

準備が整ったので、次は高度な特徴量エンジニアリング技術のエキサイティングな世界を掘り下げてみましょう。このセクションでは、予測モデルを強化できる 4 つの強力な方法を段階的に実装していきます。各方法は独自の目的を果たし、モデルのパフォーマンスに大きな違いをもたらす可能性のある洞察と改善を提供します。

方法 1: 相互情報 - 関係から情報を抽出する

モデルにとって最も影響力のある特徴を外科的精度で選択できることを想像してみてください。相互情報化により、まさにそれを実現できます。各特徴とターゲット変数の間の関係を定量化することで、予測に影響を与える主要な要因を特定できます。コードを順を追って説明し、各ステップの詳細な説明を提供して、この洞察力に富んだテクニックを習得できるようにします。

方法 2: クラスタリング - グループ化によるパターンの発見

クラスターはデータ内の貴重なパターンを隠すことがよくあります。クラスタリングを使用すると、これらの隠れた宝石を発見し、それらを活用してモデルの理解を高めることができます。 KMeans クラスタリングを適用して類似したインスタンスをグループ化するプロセスについて説明します。これらのクラスターに基づいて新しい機能を作成し、それらがモデルのパフォーマンスに与える影響を観察する方法を学びます。

方法 3: PCA の次元削減 - 複雑さの凝縮

高次元データは膨大な量になりますが、主成分分析 (PCA) が解決策を提供します。最も影響力のあるディメンションを特定することで、予測能力を犠牲にすることなく複雑さを軽減できます。このチュートリアルでは、PCA を使用したデータの変換について説明し、この手法が精度を維持しながらモデルを合理化する方法についての洞察を提供します。


これらの方法に加えて、強力な結果をもたらすことができる、見落とされがちなテクニックである数学的変換についても紹介します。選択した列に数学的演算を適用することで、モデルの仮定とよりよく一致するようにデータを整形できます。対数変換、平方根変換、逆変換を検討し、隠れた関係を明らかにしてモデルの精度を高める方法を示します。


このセクションでは、技術的な側面を理解するだけでなく、各メソッドの適用の背後にある理由も理解できるように、包括的な説明を提供します。最終的には、さまざまなシナリオで予測モデルを強化するために自信を持って適用できる、高度な特徴量エンジニアリング技術の貴重なツールキットを手に入れることができます。


各手法の複雑さを調査し、その可能性を明らかにし、より正確で強力な予測モデルに変換する機能を設計するための専門知識を身につける準備はできていますか?この啓発的な旅を始めましょう!

コード

パッケージのインポート

まず必要なパッケージをすべてインポートしましょう。

 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.feature_selection import SelectKBest, mutual_info_regression from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.preprocessing import LabelEncoder, StandardScaler import numpy as np

データの取得

次に、kaggle からデータセットを取得して前処理しましょう。

 # Load the dataset data = pd.read_csv('train.csv') # Data preprocessing def preprocess_data(df): # Handle missing values df = df.fillna(df.median()) # Handle categorical variables df = pd.get_dummies(df, drop_first=True) return df data = preprocess_data(data) # Prepare the data X = data.drop('SalePrice', axis=1) y = data['SalePrice'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


まず、特徴量エンジニアリングを行わずにベースライン モデルを実行し、その精度を評価しましょう。その後、4 つの特徴量エンジニアリング手法 (相互情報量、クラスタリング、PCA 次元削減、ラベル エンコーディング) を個別に適用し、モデルのパフォーマンスに対するそれらの効果を比較します。

ベースラインモデル

特徴量エンジニアリングを適用する前に、ベースライン モデルから始めます。ここでは、単純な線形回帰モデルを使用して、元のデータセットを使用して住宅価格を予測します。

 baseline_model = LinearRegression() baseline_model.fit(X_train, y_train) baseline_predictions = baseline_model.predict(X_test) baseline_rmse = mean_squared_error(y_test, baseline_predictions, squared=False) print(f"Baseline RMSE: {baseline_rmse}") # ------------------ OUTPUT ---------------- # Baseline RMSE: 49204.92

ベースライン モデルでは、元の特徴をそのまま使用する単純な線形回帰モデルから開始します。トレーニング データを使用してモデルをトレーニングし、テスト データで予測を行い、二乗平均平方根誤差 (RMSE) を計算して、目に見えないデータに対するモデルのパフォーマンスを測定します。

相互情報モデル

# Method 1: Mutual Information mi_selector = SelectKBest(score_func=mutual_info_regression, k=10) X_train_mi = mi_selector.fit_transform(X_train, y_train) X_test_mi = mi_selector.transform(X_test) mi_model = LinearRegression() mi_model.fit(X_train_mi, y_train) mi_predictions = mi_model.predict(X_test_mi) mi_rmse = mean_squared_error(y_test, mi_predictions, squared=False) print(f"Mutual Information RMSE: {mi_rmse}") # ------------------ OUTPUT ----------------- # Mutual Information RMSE: 39410.99

ここでは、ターゲット変数に関して各機能が提供する情報を調べています。ターゲットとの相互情報スコアが最も高い上位 10 個の特徴を選択します。次に、これらの選択した特徴のみを使用して、新しい線形回帰モデルをトレーニングします。これは、モデルが最も有益な特徴に焦点を当てていることを確認し、RMSE を計算して、このモデルの予測がベースラインとどのように比較されるかを確認するのに役立ちます。

クラスタリングモデル

# Method 2: Clustering num_clusters = 5 kmeans = KMeans(n_clusters=num_clusters, random_state=42) X_clustered = X.copy() X_clustered['Cluster'] = kmeans.fit_predict(X) X_clustered = pd.get_dummies(X_clustered, columns=['Cluster'], prefix='Cluster') X_train_clustered, X_test_clustered, _, _ = train_test_split(X_clustered, y, test_size=0.2, random_state=42) cluster_model = LinearRegression() cluster_model.fit(X_train_clustered, y_train) cluster_predictions = cluster_model.predict(X_test_clustered) cluster_rmse = mean_squared_error(y_test, cluster_predictions, squared=False) print(f"Clustering RMSE: {cluster_rmse}") # ------------------- OUTPUT -------------- # Clustering RMSE: 47715.30

クラスタリングを使用して、データ内の類似したインスタンスをグループ化することを検討しています。具体的には、KMeans アルゴリズムを使用してデータをクラスターに分割します。各インスタンスはクラスターに割り当てられ、このクラスター情報を新しいカテゴリ特徴として追加します。これを行うことで、クラスターの観点からインスタンス間の関係を考慮する方法をモデルに提供します。このクラスター化されたデータで線形回帰モデルをトレーニングした後、RMSE を計算してそのパフォーマンスを評価します。

PCA - 次元削減モデル

# Method 3: PCA Dimensionality Reduction scaler = StandardScaler() X_scaled = scaler.fit_transform(X_train) pca = PCA(n_components=10) X_train_pca = pca.fit_transform(X_scaled) X_test_pca = pca.transform(scaler.transform(X_test)) pca_model = LinearRegression() pca_model.fit(X_train_pca, y_train) pca_predictions = pca_model.predict(X_test_pca) pca_rmse = mean_squared_error(y_test, pca_predictions, squared=False) print(f"PCA RMSE: {pca_rmse}") # --------------- OUTPUT -------------- # PCA RMSE: 40055.78

PCA は、データをより少ない次元に要約することでデータの複雑さを軽減するのに役立ちます。データを標準化して、すべてのフィーチャが同じスケールになるようにします。次に、PCA を使用してデータ内の最も重要なパターンを特定し、特徴の数を 10 個の主成分に減らします。これらのコンポーネントで線形回帰モデルをトレーニングすると、モデルを簡素化しながら最も重要な情報を取得できます。 RMSE は、このアプローチが効果的かどうかを判断するのに役立ちます。

数学的変換モデル

# Method 5: Mathematical Transformations X_train_transformed = X_train.copy() X_test_transformed = X_test.copy() # Apply logarithmic transformation log_columns = ['GrLivArea', 'LotArea'] # Specify columns to apply log transformation X_train_transformed[log_columns] = np.log1p(X_train_transformed[log_columns]) X_test_transformed[log_columns] = np.log1p(X_test_transformed[log_columns]) # Apply square root transformation sqrt_columns = ['GarageArea', '1stFlrSF'] # Specify columns to apply square root transformation X_train_transformed[sqrt_columns] = np.sqrt(X_train_transformed[sqrt_columns]) X_test_transformed[sqrt_columns] = np.sqrt(X_test_transformed[sqrt_columns]) # Apply inverse transformation inv_columns = ['YearBuilt', 'OverallQual'] # Specify columns to apply inverse transformation X_train_transformed[inv_columns] = 1 / X_train_transformed[inv_columns] X_test_transformed[inv_columns] = 1 / X_test_transformed[inv_columns] math_transform_model = LinearRegression() math_transform_model.fit(X_train_transformed, y_train) math_transform_predictions = math_transform_model.predict(X_test_transformed) math_transform_rmse = mean_squared_error(y_test, math_transform_predictions, squared=False) print(f"Mathematical Transformations RMSE: {math_transform_rmse}") # ------------------ OUTPUT --------------- # Mathematical Transformations RMSE: 47143.21


数学的変換には、基礎的なパターンを明らかにするために数学的演算を使用して特徴値を変更することが含まれます。対数変換、平方根変換、および逆変換を特定の列に適用します。たとえば、対数変換は歪んだデータの正規化に役立ち、平方根変換は外れ値の除去に役立ち、逆変換は小さな値との関係を強調できます。これらの変換された特徴を使用して線形回帰モデルをトレーニングし、RMSE を計算して、変換によってモデルの予測能力が向上したかどうかを評価します。


これらすべての方法では、データをモデリングにさらに適したものにするために、さまざまな手法を試しています。目標は、最小の RMSE につながる方法を見つけることです。これは、モデルの予測が実際のターゲット値に近く、したがってより正確であることを示します。

結果の比較

  1. ベースライン RMSE: 49204.92これは、特徴量エンジニアリングや変換が適用されていないベースライン モデルの二乗平均平方根誤差 (RMSE) です。オリジナルの機能をそのまま使用したモデルです。 RMSE 49204.92 は、テスト データに対するベースライン モデルの平均予測誤差を示します。


  2. 相互情報量 RMSE: 39410.99この RMSE は、相互情報量特徴選択方法を適用した後のモデルのパフォーマンスを表します。これはベースライン RMSE よりも大幅に低く、相互情報量スコアに基づいて上位 k 個の特徴を選択することでモデルのパフォーマンスが向上したことを示しています。


  3. クラスタリング RMSE: 47715.30ここでの RMSE は、クラスタリングに基づく新しいカテゴリ特徴量を導入した後のモデルのパフォーマンスに対応します。 RMSE はベースライン RMSE に近く、このケースではクラスタリングの導入が大幅な改善につながらなかったことを示唆しています。


  4. PCA RMSE: 40055.78この RMSE は、次元削減のために PCA を適用した後のモデルのパフォーマンスを反映します。これは相互情報量 RMSE よりは若干高くなりますが、ベースライン RMSE よりは低くなります。 PCA 変換された特徴を使用するモデルは、ある程度のパフォーマンスを発揮するようです。


  5. ラベル エンコーディング RMSE: 49204.92ここでの RMSE は、カテゴリ変数がラベル エンコードされている場合のモデルのパフォーマンスを示します。 RMSE はベースライン RMSE と一致しており、この場合、ラベル エンコードされた機能を使用しても顕著な改善が得られなかったことを示しています。


  6. 数学的変換 RMSE: 47143.21この RMSE は、選択した列にさまざまな数学的変換を適用した後のモデルのパフォーマンスを表します。 RMSE はベースライン RMSE よりも低く、これらの変換がモデルのパフォーマンスの向上につながったことを示唆しています。


要約すれば:


  • 相互情報は、 RMSE を大幅に低減するため、試した方法の中で最も効果的な特徴選択方法であると思われます。
  • PCA数学的変換の両方により、ベースラインと比較してモデルのパフォーマンスが向上しました。
  • この特定のシナリオでは、クラスタリングに大きな改善は見られませんでした。


実際の RMSE 値とその解釈は、データセット、モデルの複雑さ、ターゲット変数の性質などのさまざまな要因に依存することに注意してください。目標は、さまざまな特徴量エンジニアリング手法を試して、目に見えないデータで最高のパフォーマンスをもたらす手法を選択することです。