ゼロからはじめる機械学習講座「前処理と特徴量エンジニアリング」


### サンプルソースの公開場所
https://github.com/techgymjp/techgym_ai

### 動画解説
https://youtu.be/EQWWrWWHQe4

実行環境がない場合はanacondaをinstallしてください。(抜粋版なので問題番号は連番ではないです)

## ■2-1：ヒストグラム：4DSa.py
【問題】
　データの特徴を知る方法としてヒストグラム(度数分布図)がある。これは度数と階級をグラフにしたもので、データの分布状況を視覚的に捉えることが出来る。

### (1)	ヒストグラムを実際に表示してみよう。
scikit-learnに組み込まれている、乳がん細胞のデータの中に含まれている細胞核の半径(mean radius)をヒストグラムとして表示する。このとき、matplotlibのhistメソッドを用いてbins=16にする。
■解答はOk8C.py

### (2)他の方法でもヒストグラムを表示してみよう。
seabornライブラリ(distplot)を使用してヒストグラムを表示する。データは(1)と同じものを用いる。
また、カーネル密度関数も描画する。これはサンプルデータから元の確率分布を推定するものです。
描画の設定はsns.set_style('whitegrid')とする。bins=16、label='mean radius'とする。
■解答はaWD4.py

## ■2-3：欠損値：xSD3.py
　扱うデータには欠損値があるデータがある。定義上値が存在しないことや、入力をすることをミスしていてい値がないことや、センサーデータのエラーによって取得出来なかったなどの様々な理由がある。　

### 【問題】
乳がん細胞のデータの中に含まれている細胞核の半径(mean radius)を用いる。問題で欠損値NaNを埋め込んでいる。

#### (1)	欠損値の確認をする。欠損値の数、データの数、平均値を表示する。また、以下の欠損値の処理をした後で欠損値の数、データの数、平均値を毎回表示する。
◎NaNがある行をすべて取り除く(リストワイズ削除)
◎NaNを0に置き換える
◎NaNを直前の行の値で置き換える。さらに、NaNを直後の行の値で置き換える
◎NaNを平均値で置き換える
■解答はV8Ay.py

#### (2)欠損値を補完値で置き換えてみる。
◎平均値から標準偏差でばらつきを考慮して補完(標準偏差の範囲内でランダムに補完値を作る)
◎interpolate()で線形補間をする(補完方法はlinear、補完方向はforward、補完領域はinside)
■解答はSKx7.py

## ■2-5：正規化(スケーリング)：DOe4.py
　スケーリングをする方法として、変数の範囲を０から1の区間にする方法がある。このMin-Maxスケーリングはあらかじめ変数の範囲が決まっているときには有効となる。ただし、この方法では外れ値の影響を受けることもあり、平均値がちょうど０にならない。
　データの最大値をmax(x)、最小値をmin(x)としたとき、各変数(x)から最小値min(x)を引いた値を最大値max(x)と最小値min(x)の差で割ったものが新しい変数(x’)になる。このとき、最小値が1で最小値が０になる。

### 【問題】
(1)	scikit-learnに組み込まれている、乳がん細胞のデータで目的変数をtarget、説明変数をdataとしてロジスティック回帰でモデルをつくり、陽性・陰性を予測してみる。テストデータと訓練データの分割にはtrain_test_splitを使用する。訓練データとテストデータの正解率を計算し表示する。
データをMin-Maxスケーリングして、同様にロジスティック回帰で予測をする。このときに、正解率がどの程度変化するかを調べてみる。(回帰の条件はrandom_state=0,solver='liblinear')
■解答はpJ0C.py

## ■2-6：カテゴリ変数：PZ6b.py
　数値変数以外にも文字列などのカテゴリ変数がある。このカテゴリ変数はそのままでは分析に使えずに変換する必要がある。数値のデータでも値に意味がない場合はカテゴリ変数として扱うこともある。

### 【問題】
(1)	one-hot-encodingはカテゴリの列を作って、その列の１つだけを「１」 にして、その他の列を「０」にする。与えられたデータフレームのカテゴリ変数をone-hot-encodingする。このとき、get_dummiesを使用する。さらに、one-hotのvectorを自分で作成して表示する。
■解答はBCh6.py
(2)	scikit-learnのOneHotEncoderを使用してカテゴリ変数をone-hot-encodingを実行する。
■解答はVWs2.py
(3)	one-hot-encodingではカテゴリ変数が非常に多い場合には変換後の変数は0が多い特徴量になる。余計な0を入れないようにするために、Feature Hashingという変換方法がある。これは、ハッシュ関数を用いてカテゴリ変数を変換する。この方法では、変換後の特徴量の数(ベクトル次元)を自分で決めることが出来る。
与えられたデータフレーム(df_D)でsklearn.feature_extractionのFeatureHasherを使用して変換を実行してみる。(このとき特徴量のベクトル次元は５とする)
■解答はVw4L.py

## ■2-8：特徴量エンジニアリング：CDh3.py
【問題】
実際のデータを使用してこれまでに学んできたことを実践してみよう。サッカーゲームに使用する選手のデータを分析する。FIFA19の選手データベースがあるのでこれを用いる。(https://www.kaggle.com/karangadiya/fifa19)

### (1)	欠損値があるデータはそのままでは使用出来ないので、場所を確認して欠損値を補完する。文字列のデータの箇所は特定の値を指定して欠損値を補完する。
	Club → No_Club
	Preferred Foot → Right
	International Reputation → 1
	Weak Foot → 3
	Work Rate → Medium/ Medium
	Body Type → Normal
	Position → ST
	Jersey Number → 8
	Joined → Jul 1, 2018'
	Loaned From → None
	Contract Valid Until → 2019
	Height → 5'11
	Weight → 200lbs
	‘Wage’ → €200k
	'Release Clause' → €4.2M
その他の数値のデータは平均値で補完する。
‘Skill Moves’は整数値で平均値では補完出来ないので中央値で補完する。
ポジションについては補間せずにそのままにしておく(‘LS’〜’RB’)
　　また、その他のNaNがある場合に備えて、残りのNaNは「0」に置き換える。
　　さらに、URLなどの以下の不要な行を取り除く。('Unnamed: 0','Photo','Flag','Club Logo')
■解答はX2Fm.py

### (2)	分析に使用する新しい特徴量を作成してみる。
まずは、特徴量の操作をする関数を自分で定義して、その関数をapplyメソッドによってデータに適用させて、新しい列を追加する。
Defending : 'Marking','StandingTackle','SlidingTackle'のすべてを平均値した値
General : 'HeadingAccuracy','Dribbling','Curve','BallControl'のすべてを平均値した値
Mental : 'Aggression','Interceptions','Positioning','Vision','Composure'のすべてを平均値した値
Passing : 'Crossing', 'ShortPassing','LongPassing'のすべてを平均値した値
Mobility : 'Acceleration','SprintSpeed','Agility','Reactions'のすべてを平均値した値
Power : 'Balance','Jumping','Stamina','Strength'のすべてを平均値した値
Rating : 'Potential','Overall'のすべてを平均値した値
Shooting : 'Finishing','Volleys','FKAccuracy','ShotPower','LongShots','Penalties'のすべてを平均値した値
さらに、すべての定義する関数では計算したものに対してroundメソッドによって値を丸める。
また、作成したすべての特徴量のヒストグラムを表示する。
後の課題で使用するために、’FIFA_data_pre.csv’としてファイルに書き出す。
■解答はO9Wq.py

## ■2-9：特徴量エンジニアリング：iT8G.py

【問題】
サッカーゲームに使用する選手のデータを分析する。前の課題で保存したデータを使用する。
### (1)	‘Weight’(体重)には単位であるlbsが数値データについている。そこで、lbsを取り除く処理をする。
lbsを取り除く関数を定義して、applyメソッドでデータに適用する。‘Weight’(体重)のヒストグラムを表示する。

### (2)	選手の年俸などの金額が入っているデータはユーロ(€)が単位としてついている。そこで、このユーロを取り除く、さらに、単位がMやKになっているので数値データとして扱えるように変換する。対象となるのは、'Value'、'Wage'、'Release Clause'とする。‘Wage’(収入)のヒストグラムを表示する。
変換したデータフレームを’FIFA_data_pre2.csv’として保存する。
■解答はkSI4.py

## ■2-11：特徴量エンジニアリング：i5UD.py

### 【問題】サッカーゲームに使用する選手のデータを分析する。前の課題で保存したデータを使用する。

#### (1)	前の課題で作成した特徴量で重回帰分析を実施する。
'Defending','General','Mental','Passing','Mobility','Power','Shooting'を説明変数とする。また、'Overall'を目的変数として、重回帰分析を行い、決定係数とRMSEを計算する。
データ分割はtrain_test_splitを使用して、test_size=0.2とする。
■解答はTD0x.py

#### (2)	作成した特徴量のみでは決定係数が低いため、すべての変数を用いて予測をする。カテゴリ変数を変換して特徴量を作る。まずは、どの変数がカテゴリ変数かを確認するために型がobjectである列のみを表示する。

以下の変換をする関数を定義して、applyメソッドですべてデータに適用して、新しい列を追加する。
◎‘Real Face'はYesのときは「1」それ以外のNoのときは「0」と変換する。
◎‘Preferred Foot’は右利きのときは「1」それ以外の左利きのときは「0」と変換する。
◎サッカーのポジションは分類を変更する。’Simple_Position’として列を追加する。
GK → GK
DF → RB,LB,CB,LCB,RCB,RWB,LWB
DM → LDM,CDM,RDM
MF → LM,LCM,CM,RCM,RM
AM → LAM,CAM,RAM,LW,RW
ST → RS,ST,LS,CF,LF,RF
 ◎‘Nationality’は選手が250人より多い国のときは「1」それ以外の250以下のときは「0」とする。

(3)	‘Work Rate’は「/」の文字で区切られているので、それぞれの文字を分離して、新しい列として加える。新しい列は’WorkRate1’と’WorkRate2’とする。

(4)	‘Height’はfeetとinchで表記されている。「'」の文字で区切られているので、それぞれの文字を分離して新しい列とする。さらに、小数点の数値データとするため型変換をする。
feetに30.48を掛けて、inchに2.54を掛けてそれぞれを加えることでcm(センチメートル)の単位にする。これを’Height_cm’として列に加える。さらに、変換前のカテゴリ変数の列が残っているので、これを取り除く。

(5)	’Simple_Position’, ’WorkRate1’,’WorkRate2’はまだカテゴリ変数として残っているので、get_dummiesメソッドを使ってone-hot-encodingで変換する。

(6)	前問題と同様に、'Overall'を目的変数として、重回帰分析を行い、決定係数とRMSEを計算する。説明変数としては’Overall’以外のすべての変数を使用する。
■解答はX5Xy.py

## テックジム　AIエンジニア養成コース
https://techgym.jp/about/machine_learning_course/