Python 3 エンジニア認定データ分析試験 まとめノート 〜scikit-learn編〜

python_dataanalysis データサイエンス

scikit-learn

機械学習を含むデータマイニングやデータ解析のライブラリ

・学習とテストデータに分割するメソッドが用意されている→train_test_split()
・DeepLearningを行うことができる
・GPUで動かすためのサポートがない
・pandasのデータフレームを扱える

前処理

カテゴリ変数のエンコーディング

a→0、b→1、c→2…の数値へ変換
scikit-learnでは、preprocessingモジュールの「LabelEncoder」クラスで実行

【実行コード】
 from sklearn.preprocessing import LabelEncoder
 df=pd.DataFrame={‘A’:[‘a’,’b’,’a’,’b’,’c’]}
 # ラベルエンコーダのインスタンスを生成
 le= LabelEncoder()
 #ラベルのエンコーディング
 le.fit(df[‘A’])
 le.transform(df[A])
=[0,1,0,1,2]

One-hotエンコーディング=ダミー変数

カテゴリ変数に対して行う符号化処理。取りうる値の分だけ列を増やして、各行に該当する値の列のみに「1」が、それ以外の列には「0」が入力されるように変換。
scikit-learnでは、preprocessingモジュールの「OneHotEncoder」クラスで実行
pandasでは、get_dummies関数で実行 ※こっちのほうが使いやすい

【実行コード】
 from sklearn.preprocessing import LabelEncoder,OneHotEncoder
 #DataFrameをコピー
 df_ohe = df.copy()
 #ラベルエンコーダのインスタンス化
 le = LabelEncoder()
 #a,b,cを1,2,3に変換
 df_ohe[‘B’] = le.fit_transform(df_ohe[‘B’])
 #One-hotエンコーダのインスタンス化
 ohe[‘B’] = OneHotEncoder(categorial_feature=[1])
 #One-hotエンコーディング
 ohe.fit_transform(df_ohe).toarray()→疎行列(行列の多くの成分が0である行列↔密行列)を返す
 =[[1.,0.,0.],[0.,1.,0.],[1.,0.,0.][0.,1.,0.],[0.,0.,1.]]

特徴量の正規化

特徴量の尺度を揃える。ある特徴量の値が2桁の数値(数十のオーダ)、別の特徴量の値が4桁の数値(数千のオーダ)の場合、2つの特徴量のオーダが同様になるように尺度を揃える処理。

分散正規化:特徴量の平均が「0」、標準偏差が「1」に変換。=標準化、z変換
        preprocessingモジュールの「StandardScaler」クラスで実行

最小最大正規化:特徴量の最小値が「0」、最大値が「1」に変換
        preprocessingモジュールの「MinMaxScaler」クラスで実行

分類

データの「クラス」を予測して分けるタスク。教師あり学習。

①手元のデータを学習データとテストデータに分ける→交差検証を使用する
②学習データセットを用いて分類モデルを構築(=学習)
③構築したモデルのテストデータセットに対する予測を行い、未知のデータに対する対応能力(=汎化能力)を評価
※学習はfitメソッド、予測はpredictメソッドにて実行する

・学習データとテストデータの分割
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)

サポートベクタマシン

直線や表面などで線形分離できないデータをカーネル(データ間の近さを定量化する)を使用することで線形分離し分類を行う。
・機械学習のアルゴリズムの1つ。分類、回帰、外れ値検出に使用できる。
・マージンを「最大化」することで「決定領域」を求める
→決定領域がサポートベクタから遠くなり、汎化能力を上げるため
・極端に絶対値の大きな特徴料に分類結果が影響を受けやすい傾向がある。→正規化必須

決定領域:データを分離する直線と最も近い各クラスのデータ間の距離が大きくなる直線
サポートベクタ:各クラスのデータ
マージン:クラス間のサポートベクタの距離
※matplotlib.axes.Axes.contor関数:決定境界とマージン(等高線)をプロット。決定境界は0、サポートベクタを通過する直線は-1、1を指定
※C引数:どれだけマージンを広く設定するか
※kernel引数:’linear’→直線、’rbf’→動径基底関数

決定木

データを分割するルールを次々と作成していくことで分類を実行するアルゴリズム。
※最終利用からの経過日数 10日以上→利用回数 5回以上→離反しない
                       5回未満→離反する
             10日未満→利用間隔 3日以上→離反する
                       3日未満→離反しない

ノード:頂点 ※例 最終利用からの経過日数、利用回数、利用間隔
エッジ:頂点を結ぶ線 ※例 10日以上、10日未満、5回以上、5回未満、3日以上、3日未満
親ノード:木を家系図に見立てて親の位置にあるノード ※例 最終利用からの経過日数
子ノード:木を家系図に見立てて子の位置にあるノード ※例 利用回数、利用間隔
根ノード:木の最上部にあり、親ノードを持たないノード
葉ノード:木の最下部にあり、子ノードを持たないノード
情報利得:決定木でデータを分類する際、データを分割することによってどれだけ「得」をするか
→クラストよりきれいに分けられるようになること=不純度が少ない
         情報利得=親ノードでの不純度ー子ノードでの不純度の合計
→正の場合:親ノードのほうがクラスが混在していることを表す=子ノードに分割したほうがいい
 負の場合:親ノードのほうがクラスが混在していない=子ノードに分割しないほうがいい

treeモジュールの「DecisionTreeClassifier」クラスで実行
 ※引数max_depth=3にて木の最大の深さを指定
pydotplusライブラリ:学習した決定木の可視化。Graph Vizという可視化ツールを使用。
①学習した決定木からtreeモジュールのexport_graphviz関数を用いてdot形式のデータを抽出
②pydotplusモジュールのgraph_from_dot_data関数を用いてグラフを表すオブジェクトを生成し、そのwrite_pngメソッドにファイル名を指定して出力
④構築した決定木を用いてpredictメソッドで予測する

不純度の指標

ジニ不純度、エントロピー、分類誤差などが用いられる

ジニ不純度:各ノードに間違ったクラスが振り分けられてしまう確率
→1-(P(0)^2+P(1)^2) ※P(0):クラスが0である確率

ランダムフォレスト

決定木をブートストラップデータを用いて複数回繰り返すアンサンブル学習。
他の機械学習アルゴリズムと比較すると欠損値の穴埋めや標準化などのデータの前処理を必要としない
ensembleモジュールの「RandomForestClassifier」クラスを使用。
→決定木の個数はn_estimatorsで指定

ブートストラップデータ:ランダムに選択されたサンプルと特徴量のデータ。実際のデータを用いた推論ができる。
アンサンブル学習:複数の学習器を用いた学習方法

回帰

ある値(目的変数)を別の単一または複数の値(説明変数)で説明するタスク。教師あり学習。

線形回帰

linear_modelモジュールの「LinearRegression」クラスで実行
単回帰:説明変数が1変数
重回帰:節目変数が2変数以上

線形回帰で微分が使用される理由:損失関数を最小にするパラメータを求める際に必要だから

クラスタリング

クラスタ(グループ)を作成して分類。教師なし学習。
種類→k-means法、フォード法、単純連結法

k-means法

・クラスターの個数はハイパーパラメータ
・教師ラベルは必要ない=教師なし学習
・intiの引数にrandomを指定すると最初のクラスター点をランダムに選ぶため、初期依存性がある
・クラスターの重心位置の更新回数は指定できない
①clusterモジュールの「KMeans」クラスをインスタンス化
②fit_predictメソッドにデータを与えてクラスタリングを実行 
fit_predict():fitメソッドとpredictメソッドを両方実行し、学習と予測を一度にまとめて行う

引数 n_clusters:クラスタ数
   inti:初期値の与え方。’random’と’k-means++'(初期のクラスタ中心が離れた位置になる)
   n_inti:k-meansを実行する回数
   max_iter:k-meansで反復する最大回数
   tol:k-meansの収束を判定する許容誤差
   random_state:乱数のシードを固定するために指定する整数

階層的クラスタ

凝集型:いくつかの小さなクラスタを作る→1つになるまで処理を繰り返す
 clusterモジュールの「AgglomerativeClustering」クラスにて実行
分割型:最初を1つのクラスタとする→分割していく

次元削減

データの情報をなるべく損ねることなく、次元を削減して「圧縮」

主成分分析

高次元のデータに対して分散が大きくなる方向を探して元の次元かそれよりも低い次元に変換する手法
①decompositionモジュールの「PCA」クラスをインスタンス化
 (引数n_componentsにて変換する変数の数を指定)
②fit_transformメソッドにデータの座標を表すNumpy配列を指定

モデルの評価

カテゴリの分類精度

以下を混合行列から計算
適合率:予測が正のうち、実際に正だった割合。なるべく間違えたくないもの。
再現率:実際が正のうち、予測が正だった割合
正解率:すべての数から予測が当たった割合。
F値:適合率と再現率の調和平均。
※metricsモジュールの「classification_report」関数にで適合率、再現率、F値を取得できる

交差検証

データセットを学習用とテスト用二分割する処理を繰り返し、モデルの構築と評価を複数回行う。model_selectionモジュールの「cross_val_score」関数にて実行

層化k分割交差検証:割合を揃えながらk分割する。交差検証の欠点である各検証における予測ラベルの割合が不均一になる問題を解決する

Leave-One-Out法:1つだけテストとし、残りを学習データとする。→繰り返す
 ※LeaveOneOutメソッドで実行

予測確率の正確さ

ROC曲線:データに対する予測確率の正確さを定量化する指標
 確率の高い順にデータを並べたとき、各データの確率以上のデータはすべて正例であると予測
 →実際に正例であったデータが全体の正例にしめる割合(真陽性率)、
  実際負例にもかかわらず正例と予測されたデータが全体の負例にしめる割合(偽陽性率)を計算
 →真陽性率を横軸、偽陽性率を縦軸にプロットする
※真陽性率と偽陽性率はmetricsモジュールのroc_curve関数にて計算可能

AUC:ROC曲線の面積。0.5に近づくほど予測がうまくいっていない。

ハイパーパラメータの最適化

ハイパーパラメータ:ユーザが指定する値
例:決定木の木の深さ、ランダムフォレストの決定木の数、等

グリッドサーチ

ハイパーパラメータの候補を指定して最も良い予測のものを選ぶ・交差検証による最適な決定木の深さは毎回変わる。
・max_depth:[3,4,5]で最適な深さを3〜5に指定
・best_params_:GridSearchCVクラスで最も制度が良いときのハイパーパラメータの値を取得する属性
・引数cvにStratifiedKFoldクラスやKfoldクラスのインスタンスを明示的に指定しなければGridSearchCVの実行結果が毎回変わる。

ランダムサーチ

取りうるハイパーパラメータを無作為に抽出してモデルの性能を評価

その他用語

・RMSE:最小2乗誤差。回帰に用いる損失関数・

・ロジスティック回帰で予測する値はラベルの「確率」
 predict_proda():予測確率の取得

・正規表現 re
 group():グルーピングされたマッチング結果の文字列を変える
 search():正規表現パターン似最初にマッチした文字列を探してマッチオブジェクトを返す

コメント

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