Scikit-learn 備忘録

学習中に調べた`Scikit-learn`ライブラリのことを備忘録として残します。
記述しているParameters、Attributes、Methodsは主なもののみ。
[(公式)：APIリファレンス](https://scikit-learn.org/stable/modules/classes.html?highlight=model_selection#module-sklearn.datasets)
[scikit-learn で機械学習](https://pythondatascience.plavox.info/scikit-learn)

-------------------------------------------------------------------------------------
## sklearn.model_selection：モデルの選択
スプリッタークラス、スプリッター機能、ハイパーパラメータオプティマイザ、モデルの検証を含む。

#### train_test_split
訓練データとテストデータに分割する。

```python
# Parameters
test_size = 0.3 # テスト分割に含めるデータセットの比率(`train_size`で訓練の割合指定も可)

# shuffle = シャッフルするか
# stratify = 層化抽出：均等に分割させたいデータ（多くの場合は正解ラベル）
x_train, x_test, t_train, t_test = train_test_split(x, t, test_size=test_size, shuffle=True, stratify=data.target, random_state=0)

# 訓練データセットの正解ラベルの数を確認
from collections import Counter
print(Counter(t_train))
```
#### GridSearchCV：グリッドサーチ
推定量のパラメータ値を指定して網羅的に探索する。

```python
# Parameters
# ハイパーパラメータを探索する範囲
param_grid = {
    'max_depth' : [1, 10, 20],
    'min_samples_split' : [2, 20, 30]
}
model_grid = GridSearchCV(estimator=estimator, # 学習に使用するモデル
                           param_grid=param_grid, 
                           cv=cv, # K-分割交差検証のKの値
                           return_train_score=False) # 学習データに対するスコアを計算するか
# Attributes
model_grid.cv_results_ # 学習結果(DataFrame型)
pd.DataFrame(tuned_model.cv_results_).sort_values('rank_test_score') # 学習結果をテスト結果でソート
model_grid.best_params_ # 最も良い結果が得られたパラメータ設定
model_grid.best_estimator_ # 最も良い結果が得られたモデル
model_grid.best_score_ # 最も良い結果が得られたモデルのスコア
```
#### RandomizedSearchCV：ランダムサーチ
ハイパーパラメータのランダム検索。

```python
# Parameters
# ハイパーパラメータを探索する範囲
param_distributions = {
    'max_depth' : [1, 10, 20],
    'min_samples_split' : [2, 20, 30]
}
model_random = RandomizedSearchCV(estimator=estimator, # 学習に使用するモデル
                                  param_distributions=param_distributions,
                                  n_iter=n_iter, # サンプリングされるパラメータ設定の数
                                  cv=cv, # K-分割交差検証のKの値
                                  return_train_score=False) # 学習データに対するスコアを計算するか
```
#### cross_val_score
交差検証によるスコアの評価

```python
cross_val_score(estimator, x, t, cv=cv)
# Return：交差検証の実行ごとの推定量のスコアの配列(ndarray型)
```
-------------------------------------------------------------------------------------
## sklearn.decomposition：行列分解

#### PCA：主成分分析(Principal component analysis)


```python
# Parameters
pca = PCA(n_components=2) # 保持するコンポーネント(次元)の数
# Attributes
pca.components_ # 主成分
pca.mean_ # 平均
pca.get_covariance() # 分散
pca.explained_variance_ratio_[i] # iの寄与率
# Methods
pca.transform(x) # 次元削減
```
-------------------------------------------------------------------------------------
## sklearn.preprocessing：前処理と正規化
スケーリング、センタリング、正規化、2値化の方法を含む。

#### LabelEncoder：Label Encoding
文字列や数値で表されたラベルを，0~(ラベル種類数-1)までの数値に変換する。

```python
# モデルの定義
le = LabelEncoder()

# Attributes
le.classes_ # 各クラスのラベルを取得

# Methods
le.fit(labels) # ラベルとラベルIDの対応づけ
ids = le.transform(labels) # 変換(エンコード)
ids = le.fit_transform(labels) # fit + transform
labels = le.inverse_transform(ids) # 変換(デコード)
```

#### StandardScaler
平均値を除去し、単位分散にスケーリングすることで、特徴を標準化する。

```python
std_scaler = StandardScaler()
# Methods：fit, transform, fit_transform, get_params
```

-------------------------------------------------------------------------------------
## sklearn.linear_model：線形モデル
さまざまな線形モデルを実装する。
線形分類器、古典的な線形回帰子、回帰のための一般化線形モデルなどを含む。

```python
# 例) LinearRegression(線形回帰)
# モデルの定義
model = LinearRegression()

# Attributes
model.coef_ # 回帰変数(重み)
model.intercept_ # 回帰直線の切片

# Methods
model.fit(x_train, t_train) # モデルの学習(訓練)
model.get_params() # パラメータの取得
model.set_params(**params) # パラメータの設定
model.predict(x_test) # 予測値を算出(推論)
model.score(x_test, t_test)) # 予測値の決定係数
```
#### LinearRegression
通常の最小二乗法による線形回帰

```python
model = LinearRegression()
```
#### Ridge：Ridge回帰
線形回帰の過学習を抑制する方法の一つ。
l2正則化を用いた線形最小二乗法。
独立変数が強く相関している場合に、重回帰モデルの係数を推定する方法

```python
# Parameters
alpha = 1 # 正則化の強さ。値が大きいほど、正則化が強くなる。
ridge = Ridge(alpha=alpha)
```
#### Lasso：Lasso回帰
線形回帰の過学習を抑制する方法の一つ。
L1事前分布を用いて学習した線形モデル。
変数選択と正則化の両方を実行し、生成する統計モデルの予測精度と解釈可能性を向上させる回帰分析手法

```python
# Parameters
alpha = 1 # L1項を乗算する定数
lasso = Lasso(alpha=1)
```
#### LogisticRegression：ロジスティック回帰
ロジスティック関数により、目的変数と説明変数の関係を表現するモデル

```python
# Parameters
C = 1.0　# コストパラメータ。誤った予測に対するペナルティ。
penalty = 'l2' # 正則化を行う方法を決定する。
# クラスに関連付けられた重み。balancedは，入力データ中のクラスの頻度に反比例した重みを自動的に調整するために，y の値を使用する。
class_weight='balanced'
log_reg = LogisticRegression(C=C, penalty=penalty, class_weight=class_weight)

# Methods
log_reg.predict_proba(x_test) # 推論の確率の分布。予測されたクラスに属する確率を0～1の実数で表す。
```
-------------------------------------------------------------------------------------
## sklearn.ensemble：アンサンブルメソッド
分類、回帰、異常検出のためのアンサンブルベースの方法を含む。

#### RandomForestClassifier：ランダムフォレスト分類器
クラス分類用

```python
# Parameters
max_depth = 2 # 木構造の深さの上限
n_estimators = 3 # 構築する決定木の数
n_jobs = -1 # 並行して実行するジョブの数。-1：すべてのプロセッサを使用することを意味する。
model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, n_jobs=n_jobs)

# Attributes
model.feature_importances_ # 特徴量ごとの重要度
```

#### RandomForestRegressor：ランダムフォレスト回帰
回帰分析用。
[ブートストラップサンプリング](https://qiita.com/tjmnmn/items/3aed6fb85f75446f74ca)：母集団となるデータがあるときに，母集団から重複を許してランダムにいくらかデータを取り出して再標本化をする手法

```python
# Parameters
# bootstrap = ブートストラップサンプル(復元抽出)を使用するか。Falseの場合、データセット全体を使って各ツリーを構築。
# max_depth = 木構造の深さの上限
# n_estimators = 構築する決定木の数
# n_jobs = 並行して実行するジョブの数。-1：すべてのプロセッサを使用することを意味する。
model = RandomForestRegressor(bootstrap=True, max_depth=None,
           n_estimators=10, n_jobs=-1)

# Attributes
model.feature_importances_ # 特徴量ごとの重要度
```

-------------------------------------------------------------------------------------
## sklearn.metrics：メトリクス(指標)
スコア関数、パフォーマンスメトリック、ペアワイズメトリック、および距離計算が含まれる。

#### confusion_matrix：混合行列
分類の精度を評価するために、混同行列を計算します。

```python
# Parameters
labels = label_list # 行列のインデックスとなるラベルのリスト
c_matrix = metrics.confusion_matrix(t_test, y, labels=labels)
```
#### 適合率、再現率、F値
- precision_score：Precision(適合率)
- recall_score：Recall(再現率)
- f1_score：F1 score(F値)
- precision_recall_fscore_support：(適合率、再現率、F値)

```python
# Parameters
average = None # Noneの場合は、各クラスのスコアが返される。
precision = metrics.precision_score(t_test, y, average=average)
recall = metrics.recall_score(t_test, y, average=average)
f1_score = metrics.f1_score(t_test, y, average=average)
precision, recall, f1_score, total = metrics.precision_recall_fscore_support(t_test, y)
```
#### roc_curve：ROC曲線(受信者動作特性)

```python
# Parameters
y_true = t # 真のバイナリラベル
y_score = y_proba # 真のクラスの確率推定値
# fpr：偽陽性率, tpr：真陽性率, threshold：閾値
fpr, tpr, threshold = metrics.roc_curve(y_true=y_true, y_score=y_score)
```
#### auc：Area Under the Curve

```python
# Parameters
metrics.auc(fpr=fpr, tpr=tpr) # fpr：偽陽性率, tpr：真陽性率
```
-------------------------------------------------------------------------------------
## sklearn.cluster：クラスタリング
一般的な教師なしクラスタリングアルゴリズムを収集します。

#### KMeans：K-平均法

```python
kmeans = KMeans(n_clusters=3) # 形成するクラスターの数と生成する重心の数
# Attributes
kmeans.cluster_centers_ # クラスタセンターの座標。最終的に収束した重心の位置。
```
-------------------------------------------------------------------------------------
## sklearn.cross_decomposition：相互分解

#### PLSRegression：PLS回帰
線形回帰の過学習を抑制する方法の一つ。
多重共線性がある場合の予測モデル

```python
# Parameters
n_components= 7 # 保持するコンポーネント(次元)の数
pls = PLSRegression(n_components=n_components)
```
-------------------------------------------------------------------------------------
## sklearn.svm：サポートベクターマシン
サポートベクターマシンアルゴリズムを含む。
2つのカテゴリを識別する分類器。
境界線に最も近いサンプルとの距離（マージン）が最大となるように境界線が定義される。
[SVM(RBFカーネル)のハイパーパラメータを変えると何が起こるの?](https://qiita.com/sz_dr/items/f3d6630137b184156a67)

#### SVC：C-サポートベクター分類

```python
# Parameters
C = 100.0 # コストパラメータ。誤った予測に対するペナルティ。
gamma = 0.001 # モデルの複雑さを決定する。
svc = SVC(C=C, gamma=gamma)
```
-------------------------------------------------------------------------------------
## sklearn.tree：決定木
決定木をベースにした分類と回帰のモデルを含む。

#### DecisionTreeClassifier：決定木分類器

```python
# Parameters
max_depth = 3 # 木構造の深さの上限
min_samples_split = 2 # 木構造の分岐先の値
dtree = DecisionTreeClassifier(max_depth=max_depth, min_samples_split=min_samples_split)
```

#### export_graphviz：決定木のGraphViz表現を生成し、DOT形式でエクスポート
```python
# Parameters
Decision_tree = dtree # 決定木
dot_data = export_graphviz(Decision_tree=Decision_tree)
graph_tree = graphviz.Source(dot_data) # GraphViz表現で木構造の表示
```
-------------------------------------------------------------------------------------
## sklearn.datasets：データセット
分類（classification）や回帰（regression）などの機械学習やデータマイニングをすぐに試すことができるよう、​実験用データが同梱されている。
`from sklearn.datasets import ***`でインポートまたは`sklearn.datasets.***`で直接指定する。

- load_digits：数字データセット（分類）
- load_breast_cancer：乳がんデータセット（分類）
- load_boston：ボストンの住宅価格データセット（回帰）
- load_iris：アイリス(アヤメ科の花)データセット（分類）

-------------------------------------------------------------------------------------