教師あり/なし学習でおさえておくべきことを軽くまとめてみた

備忘録も兼ねて、「教師あり学習」と「教師なし学習」について、概要・利用するクラス・事例・キーワードと、学習する上で参考になったサイトについてまとめておきます。

##『教師あり学習』
めちゃザックリ：特徴を表すデータと対応する答えのデータを与えて学習させることで予測モデルを作る。予測には分類問題と回帰問題がある。
###各手法
####①線形回帰
あらゆる直線のうち、損失関数（誤差関数）の値が最も小さくなるパラメータを求める。

- 利用するクラス：`sklearn.linear_model.LinearRegression`
- 事例：来客数と売上高の関係 など
- キーワード：単回帰、重回帰、多項式回帰、非線形回帰
- 参考サイト：[scikit-learn で線形回帰 (単回帰分析・重回帰分析)](https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0)

####②ロジスティック回帰
二値分類のアルゴリズムで、分類問題に適用される。

- 利用するクラス：`sklearn.linear_model.LogisticRegression`
- 事例：営業訪問回数・満足度と売上の関係 など
- キーワード：シグモイド関数、交差エントロピー誤差関数
- 参考サイト：[scikit-learnのロジスティック回帰でiris(アヤメ)の分類](https://machine-earning.net/article/sklearn-lr-iris/)

####③SVM（線形）
決定境界（直線）がデータから離れるように学習するアルゴリズムで、分類と回帰のどちらにでも使える。

- 利用するクラス：`sklearn.svm.SVC`
- 事例：テキスト分類、数字認識 など
- キーワード：ハードマージン、ソフトマージン
- 参考サイト：[サポートベクターマシン(SVM)とは？〜基本からPython実装まで〜](https://kenyu-life.com/2019/02/11/support_vector_machine/)

####④SVM（カーネル法）
カーネル関数により実空間のデータを超平面で分離できる空間に写像してから、データ集合を分離する。

- 利用するクラス：`sklearn.svm.SVC`
- 事例：色情報からの品種識別 など
- キーワード：カーネル関数（シグモイドカーネル、多項カーネル、RBF[放射基底関数]カーネル）
- 参考サイト：[【Python】各種カーネル関数を使ってサポートベクターマシンを実装する【irisデータセット】](https://kenyu-life.com/2019/08/24/iris_svm_kernel/)

####⑤ナイーブベイズ
特徴量がそれぞれ独立であるという仮定のもとで、データがあるラベルである確率を計算する。

- 利用するクラス：`sklearn.naive_bayes.MultinomialNB（他にGaussianNB、GaussianNBなど）`
- 事例：迷惑メール判定 など
- キーワード：スムージング
- 参考サイト：[scikit-learn によるナイーブベイズ分類器](https://qiita.com/ynakayama/items/ca3f5e9d762bbd50ad1f)

####⑥ランダムフォレスト
多様性のある複数の決定木から出力を集め、多数決で分類の結果を出す。

- 利用するクラス：`sklearn.ensemble.RandomForestClassifier`
- 事例：行動履歴や属性による分類
- キーワード：ジニ係数、ブートストラップ法
- 参考サイト：[[入門]初心者の初心者による初心者のための決定木分析](https://qiita.com/3000manJPY/items/ef7495960f472ec14377)

####⑦ニューラルネットワーク
入力と出力の間に中間層を挟むことで、複雑な決定境界を学習する。

- 利用するクラス：`sklearn.neural_network.MLPClassifier`
- 事例：画像認識、音声認識
- キーワード：単純パーセプトロン、活性化関数、アーリーストッピング
- 参考サイト：[自分でニューラルネットワークを作ろう](https://qiita.com/takahiro_itazuri/items/d2bea1c643d7cca11352)

####⑧k近傍法
入力データの近傍k個の分類の多数決により判定を行う。

- 利用するクラス：`sklearn.neighbors.KNeighborsClassifier`
- 参考サイト：[機械学習 〜 K−近傍法 〜](https://qiita.com/fujin/items/128ed7188f7e7df74f2c)

        
###評価方法
- **a. 分類問題の場合**
 - a-1. 混同行列<br>
    利用するクラス：`sklearn.metrics.confusion_matrix`
 - a-2. 正解率<br>
    利用するクラス：`sklearn.metrics.accuracy_score`
 - a-3. 適合率<br>
    利用するクラス：`sklearn.metrics.precision_score`
 - a-4. 再現率<br>
    利用するクラス：`sklearn.metrics.recall_score`
 - a-5. F値<br>
    利用するクラス：`sklearn.metrics.f1_score`
 - a-6. ROC-AUC<br>
    利用するクラス：`sklearn.metrics.roc_curve`<br>

　参考サイト：
　[scikit-learnで混同行列を生成、適合率・再現率・F1値などを算出](https://note.nkmk.me/python-sklearn-confusion-matrix-score/)
　[scikit-learnでROC曲線とそのAUCを算出](https://note.nkmk.me/python-sklearn-roc-curve-auc-score/)
            
- **b. 回帰問題の場合**
 - b-1. 平均二乗誤差<br>
   利用するクラス：`sklearn.metrics.mean_squared_error`
 - b-2. 平均絶対誤差<br>
   利用するクラス：`sklearn.metrics.mean_absolute_error`
 - b-3. 決定係数<br>
   利用するクラス：`sklearn.metrics.r2_score`<br>
                
　参考サイト：[scikit-learn で回帰モデルの結果を評価する](https://pythondatascience.plavox.info/scikit-learn/%E5%9B%9E%E5%B8%B0%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%95%E4%BE%A1)
            
###過学習を防ぐ方法
- **a. ハイパーパラメータ**
 - a-1. グリッドサーチ<br>
   利用するクラス：`sklearn.grid_search.GridSearchCV`
 - a-2. ランダムサーチ<br>
   利用するクラス：`sklearn.grid_search.RandomizedSearchCV`<br>
            
　参考サイト：[scikit-learnでモデルのハイパーパラメータチューニングをしよう！](https://qiita.com/ragAgar/items/2f6bebdba5f9d7381310)

- **b. データ（学習データ＆検証データ）の分割**
 - b-1. ホールドアウト法<br>
   利用するクラス：`sklearn.model_selection.train_test_split`
 - b-2. クロスバリデーション法<br>
   利用するクラス：`sklearn.model_selection.cross_val_score` `sklearn.model_selection.KFold`
 - b-3. リーブワンアウト法<br>
   利用するクラス：`sklearn.model_selection.LeaveOneOut`
                
　参考サイト：[機械学習、ディープラーニングでの学習データとテストデータの分割手法について](https://newtechnologylifestyle.net/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8/)

- **c. 正則化**
 - c-1. リッジ回帰<br>
   利用するクラス：`sklearn.linear_model.Ridge`
 - c-2. ロッソ回帰<br>
   利用するクラス：`sklearn.linear_model.Lasso`<br>
        	
　参考サイト：[最短でリッジ回帰とラッソ回帰を説明（機械学習の学習 #3）](https://qiita.com/MA-fn/items/851f9fc50bda034cd5c6)
        
##『教師なし学習』
めちゃザックリ：教師あり学習と異なり、目的変数は存在しない。ここでは特徴データに対し、別の形への変形や、部分集合を見つけることで、その構造を抽出する。手法に、次元削減とクラスタリングがある。

####①主成分分析（PCA）
多数の量的説明変数を、より少ない指標や合成変数に要約し、データの変数を削減する。

- 利用するクラス：`sklearn.decomposition.PCA`
- キーワード：分散共分散行列、固有値問題、累積寄与率
- 参考サイト：[主成分分析と固有値問題](https://blog.aidemy.net/entry/2017/10/19/222941)

####②K平均法（K-means法）
データを与えられたクラスタ数に分類し、似たもの同士グループに分ける。

- 利用するクラス：`sklearn.cluster.KMeans`
- 事例：マーケティングデータ分析、画像分類
- キーワード：クラスタ内平方和、エルボー法、シルエット分析、k-means++、k-medoids法
- 参考サイト：[k-meansの最適なクラスター数を調べる方法](https://qiita.com/deaikei/items/11a10fde5bb47a2cf2c2)

####③潜在意味解析（LSA）
文章データで、特徴量を単語数から潜在トピック数に削減することで、単語と文章の類似度を求める。

- 利用するクラス：`sklearn.decomposition.TruncatedSVD`
- キーワード：特異値分解、トピックモデル、tf-idf
- 参考サイト：[機械学習 潜在意味解析 理論編](https://dev.classmethod.jp/machine-learning/2017ad_20171220_lsa/)

####④非負値行列因子分解（NMF）
入出力データの値が全て非負という性質をもつ次元削減手法。

- 利用するクラス：`sklearn.decomposition.NMF`
- 事例：リコメンド、テキストマイニング
- 参考サイト：[非負値行列因子分解（NMF）をふわっと理解する](https://qiita.com/nozma/items/d8dafe4e938c43fb7ad1)

####⑤潜在的ディリクレ配分法（LDA）
文書内の単語からトピックを作成し、文書がどのトピックで構成されているかを求める。

- 利用するクラス：`sklearn.decomposition.LatentDirichletAllocation`
- 事例：自然言語処理
- キーワード：トピックモデル、ディリクレ分布
- 参考サイト：[トピックモデル（LDA）で初学者に分かりづらいポイントについての解説](http://acro-engineer.hatenablog.com/entry/2017/12/11/120000)

####⑥混合ガウス分布（GMM）
複数のガウス分布の線型結合によりクラスタリングを行う。

- 利用するクラス：`sklearn.mixture.GaussianMixture`
- キーワード：ガウス分布

####⑦局所線形埋め込み（LLE）
非線形なデータに対して、次元削減を行う。

- 利用するクラス：`sklearn.manifold.LocallyLinearEmbedding`

####⑧t分布型確率的近傍埋め込み法（t-SNE）
高次元データを二次元か三次元に次元削減する方法で、データの可視化などに利用される。

- 利用するクラス：`sklearn.manifold.TSNE`