• トップ
  • ブログ一覧
  • 機械学習で特徴量を正しく選択する方法
  • 機械学習で特徴量を正しく選択する方法

    メディアチームメディアチーム
    2020.02.05

    IT技術

    特徴量を選択する3つの方法

    本記事で、機械学習での特徴量を選択する方法について解説していきます。

    特徴量を選択することで、『モデルの精度を上げたり』『計算時間を短縮することができる』などのメリットがあります。

    今回は、「Kaggle」の中でも、特に有名なTitanic: Machine Learning from Disasterを扱い、特徴量を正しく選択する方法について解説していきます。

    Kaggle(カグル)とは

    Kaggle(カグル)は、企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォームです。

    【Titanic: Machine Learning from Disaster】
    機械学習を使用して、どの乗客がタイタニック号の難破船を生き延びたかを予測するモデルを作成します。
    https://www.kaggle.com/c/titanic

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    Filter Method

    Filter法は、目的変数と特徴量から、相関係数やカイ2乗などの統計量を計算し、特徴量を選択する方法です。

    「特徴量」と「目的変数」を一対一でみるので、特徴量同士の関係は考慮しない比較的簡単な選択方法になります。

    相関係数を利用する方法では、相関係数の絶対値が大きい順に特徴量を選択します。

    それでは、実際にタイタニックのデータを利用して実装していきたいと思います!

    データの確認

    まずは、データの確認してみましょう。

    1train = pd.read_csv("train.csv")
    2train.head()

    欠損値の有無を確認

    次に、欠損値の有無を確認します。

    1print(train.isnull().sum())
    2#PassengerId 0
    3#Survived 0
    4#Pclass 0
    5#Name 0
    6#Sex 0
    7#Age 177
    8#SibSp 0
    9#Parch 0
    10#Ticket 0
    11#Fare 0
    12#Cabin 687
    13#Embarked 2
    14#dtype: int64

    「Age」「Cabin」「Embarked」に欠損値があることが分かりました。

    「Age」はシンプルに平均値で置換し、「Embarked」は最頻値で置換します。

    「Cabin」は欠損値が多いので、今回は特徴量に入れません。

    1train["Age"] = train["Age"].fillna(train["Age"].mean())
    2train['Embarked'] = 
    3train["Embarked"].fillna(train["Embarked"].mode().iloc[0])

    get_dummies関数を使って数値にする

    相関係数を求めるには、「数値」に直す必要があります。

    そのため、get_dummies関数を使って数値にします。

    なお、今回は、数値に直すことが難しい「Name」「Ticket」は除きます。

    1train['Sex'] = pd.get_dummies(train['Sex'])
    2train_emb = pd.get_dummies(train['Embarked'])
    3
    4trainX = pd.concat([train['PassengerId'],train['Pclass'],train['Age'],
    5                    train['SibSp'],train['Parch'],train['Fare'],
    6                    train_sex,train_emb],axis=1)
    7
    8trainX.head()

    相関係数を求める

    これで、相関係数を求めることができるようになりました。

    1trainY = train['Survived'] #目的変数
    2
    3corrs = []
    4features = trainX.columns
    5
    6for c in features:
    7        corr = np.corrcoef(trainX[c], trainY)[0, 1]
    8        corrs.append(corr)
    9corrs = np.array(corrs)
    10
    11idx = np.argsort(np.abs(corrs))[::-1]
    12#重要度上位3つを格納
    13cols = trainX.columns.values[idx][:3]
    14importances = corrs[idx][:3]
    15
    16print(cols, importances)
    17
    18# ['Sex' 'Pclass' 'Fare'] [ 0.54335138 -0.33848104 0.25730652]

    出力結果を見てみると、Sex(性別)が最も相関係数が大きいことが分かりました。

    重要度を可視化

    次に、重要度を可視化してみましょう。

    1feature_importances = pd.DataFrame()
    2feature_importances['feature'] = features
    3feature_importances['importance'] = abs(corrs)

    グラフ

    分析

    全体的にみてみると、Sex(性別)が特に重要度が高いことがよくわかりますね。

    それに対して、PassengerId や Q は重要度が低い結果になりました。

    Wrapper Method

    Wrapper法は、特徴量の組み合わせを変えてモデルを学習させて、性能を評価することを繰り返して特徴量を選択する方法です。

    繰り返し学習するので、計算コストが高いことを覚えておきましょう。

    Wapper法 3つの方法

    Warapper法は、以下の3つの方法に分けることができます。

    1. 特徴量をひとつずつ減らしていく方法
    2. ひとつずつ増やしていく方法
    3. すべての組み合わせを試す方法

    mlxtendを利用して実装

    今回は、1つひとつずつ追加していく方法を、「mlxtend」を利用して実装していきます。

    1from sklearn.model_selection import train_test_split
    2from sklearn.ensemble import RandomForestClassifier as RF
    3from sklearn.metrics import roc_auc_score
    4from mlxtend.feature_selection import SequentialFeatureSelector as SFS
    5
    6X_train, X_test, y_train, y_test = train_test_split(

    これで、ひとつずつ特徴量を追加して精度をみることで、特徴量を選択することができます。

    Embedded Method

    Embedded法は、モデルの重要度を利用して特徴量を選択する方法です。

    Lasso回帰や、木モデルなどがよく利用されます。

    ランダムフォレストを使用して解説

    今回は、「ランダムフォレスト」を使用して解説していきます。

    1from sklearn.ensemble import RandomForestClassifier as RF
    2
    3clf = RF(random_state=2019)
    4clf.fit(trainX, trainY)
    5features = trainX.columns
    6fi = clf.feature_importances_
    7
    8idx = np.argsort(fi)[::-1]
    9cols = features.values[idx][:3]
    10importances = fi[idx][:3]
    11
    12print(cols, importances)
    13
    14# ['Sex' 'Fare' 'PassengerId'] [0.23151801 0.20317807 0.19022855]

    ランダムフォレストを利用しても、Sex(性別)が一番重要度が高いという結果がでました。

    可視化したデータ

    では、可視化したデータもみてみましょう!

    分析

    グラフを見てみると、「Sex」「Fare」「PassengerId」「Age」が重要度が高いことがわかります。

    それに対して、「Embarked」は重要度が低くなっています。

    まとめ

    機械学習で特徴量を選択する方法として

    1. Filter法
    2. Wrapper法
    3. Embedded法

    を紹介しました。

    今回は、例として特徴量が少ない課題を扱いましたが、特徴量の数が大量にある場合には正しく特徴量選択することがより重要になります。

    特徴量を正しく選択できるようになれば、データサイエンティストとしてさらに大きく成長できることでしょう!

    (株)ライトコードは、WEB・アプリ・ゲーム開発に強い、ITが大好きな会社です。
    機械学習でのシステム開発依頼・お見積もりはこちらまでお願いします。
    また、機械学習系エンジニアを積極採用中です!詳しくはこちらをご覧ください。

    ※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background