Pythonを使った6つの次元削減アルゴリズム

ツイートシェアシェア

Last Updated on August17,2020

次元削減は教師なし学習技術です。それにもかかわらず、教師あり学習アルゴリズムを使用した分類および回帰予測モデリングデータセットの機械学習アルゴリズムのデータ変換前処

から選択する多くの次元削減アルゴリズムがあり、すべての場合に単一の最良のアルゴリズムはありません。 代わりに、次元削減アルゴリズムの範囲と、アルゴリズムごとに異なる構成を調べることをお勧めします。このチュートリアルでは、Pythonでトップ次元削減アルゴリズムを近似して評価する方法を発見します。

このチュートリアルを完了すると、次のことがわかります。

  • Dimensionality reductionは、データ内の顕著な関係を保持する数値入力データの低次元表現を求めます。
  • 多くの異なる次元削減アルゴリズムがあり、すべてのデータセットに対して単一の最良の方法はありません。scikit-learn machine learningライブラリを使用してPythonでトップ次元削減を実装、適合、および評価する方法。

ステップバイステップのチュートリアルやすべての例のPythonソースコードファイルを含む、私の新しい本Data Preparation for Machine Learningでプロジェクトを開始します。

始めましょう。

Pythonと次元削減アルゴリズム

Pythonと次元削減アルゴリズム
Bernard Spraggによる写真。 NZ、いくつかの権利を保有しています。

チュートリアルの概要

このチュートリアルは3つの部分に分かれています。:

  1. 次元削減
  2. 次元削減アルゴリズム
  3. 次元削減の例
    1. Scikit-Learnライブラリのインストール
    2. 分類データセット
    3. 主成分分析
    4. 特異値分解
    5. 線形判別分析
    6. Isomap埋め込み
    7. ローカル線形埋め込み
    8. ローカル線形埋め込み
    9. ローカル線形埋め込み
    10. ローカル線形埋め込み
    11. ローカル線形埋め込み
    12. ローカル線形埋め込み
    13. ローカル線形埋め込み
    14. ローカル線形埋め込み
    15. ローカル線形埋め込み
    16. ローカル線形埋め込み
    17. ローカル線形埋め込み
    18. ローカル線形埋め込み
    19. ローカル線形埋め込み
    20. ローカル線形埋め込み
    21. ローカル線形埋め込み
    22. li>

次元削減

次元削減は、トレーニングデータ内の入力変数の数を減らすための技術を指します。

高次元のデータを扱うとき、データの”本質”をキャプチャする低次元の部分空間にデータを投影することによって次元を減らすこと これは次元削減と呼ばれます。-ページ11、機械学習:確率論的視点、2012。

高次元は、数百、数千、または数百万の入力変数を意味する可能性があります。

入力次元が少ないと、多くの場合、自由度と呼ばれる機械学習モデルでは、それに対応してパラメータが少ないか、より単純な構造を意味します。 自由度が多すぎるモデルは、トレーニングデータセットに過剰適合する可能性が高く、新しいデータではうまく機能しない可能性があります。

よく一般化された単純なモデルを持ち、入力変数が少ない入力データを持つことが望ましいです。 これは、入力の数とモデルの自由度が密接に関連していることが多い線形モデルに特に当てはまります。

次元削減は、モデリングの前にデータに対して実行されるデータ準備技術です。 これは、データのクリーニングとデータのスケーリングの後、予測モデルのトレーニングの前に実行される場合があります。

…次元削減は、最も関連性の高い変数にユーザーの注意を集中させ、ターゲット概念のよりコンパクトで、より簡単に解釈可能な表現を-ページ289、データマイニング:実用的な機械学習ツールとテクニック、第4版、2016。

そのため、学習データに対して実行される次元削減は、テストデータセット、検証データセット、最終モデルで予測を行うときのデータなど、新しいデータにも実

データ準備を開始したいですか?

今私の無料の7日間の電子メールクラッシュコースを取る(サンプルコード付き)。

クリックしてサインアップし、コースの無料のPDF電子ブック版を取得します。

無料のミニコースをダウンロード

次元削減アルゴリズム

次元削減に使用できる多くのアルゴリズ

方法の二つの主要なクラスは、線形代数から引き出されたものと多様体の学習から引き出されたものです。

方法の二つの主なクラスは、線形

線形代数法

線形代数のフィールドから引き出された行列分解法は、次元に使用することができます。

行列分解の詳細については、チュートリアルを参照してください:

  • 機械学習のための行列分解への穏やかな紹介

より一般的な方法のいくつかは次のとおりです。

  • 主成分分析
  • 特異値分解
  • 非負の行列分解

マニホールド学習方法

マニホールド学習方法は、入力データの顕著な特性をキャプチャする高次元入力の低次元投影を求めます。

より一般的な方法のいくつかは次のとおりです:

  • Isomap Embedding
  • Local Linear Embedding
  • Multidimensional Scaling
  • Spectral Embedding
  • t-distributed Stochastic Neighbor Embedding

各アルゴリズムは、より低い次元のデータにおける自然な関係を発見するという課題に異なるアプローチを提供しています。最適な次元削減アルゴリズムはなく、制御された実験を使用せずにデータに最適なアルゴリズムを見つける簡単な方法はありません。このチュートリアルでは、scikit-learnライブラリから、これらの一般的な次元削減アルゴリズムの各サブセットを使用する方法を確認します。

このチュートリアルでは、scikit-learnライブラリから、これらの一般的な次元削減アルゴリズム

例は、例をコピーして貼り付け、独自のデータでメソッドをテストするための基礎を提供します。私たちは、アルゴリズムがどのように機能するか、またはそれらを直接比較するかの背後にある理論に飛び込むことはありません。

このトピックの良い出発点については、以下を参照してください。

  • コンポーネント内の信号の分解、scikit-learn API。
  • マニホールド学習、scikit-LEARN API。

のは、中に飛び込みましょう。

次元削減の例

このセクションでは、scikit-learnで一般的な次元削減アルゴリズムを使用する方法をレビューします。

これには、モデリングパイプラインのデータ変換として次元削減手法を使用し、データに対するモデル適合を評価する例が含まれます。

この例は、独自のプロジェクトにコピー&ペーストし、メソッドを独自のデータに適用するために設計されています。 Scikit-learnライブラリには、アルゴリズムの性質を考慮してデータ変換として直接使用できないため、実証されていないアルゴリズムがいくつかあります。

そのため、各例では合成分類データセットを使用します。

Scikit-Learnライブラリのインストール

まず、ライブラリをインストールしましょう。最新バージョンがインストールされていることを確認する必要があるため、この手順を省略しないでください。

pip Pythonインストーラを使用してscikit-learnライブラリをインストールするには、次のようにします:

1
sudo pip install scikit-learn

For additional installation instructions specific to your platform, see:

  • Installing scikit-learn

Next, let’s confirm that the library is installed and you are using a modern version.

Run the following script to print the library version number.

1
2
3

# check scikit-learn version
import sklearn
print(sklearn.__version__)

Running the example, you should see the following version number or higher.

1
0.23.0

分類データセット

make_classification()関数を使用してテストバイナリ分類データセットを作成します。

データセットには1,000の例があり、そのうちの10は有益であり、10は冗長である20の入力特徴があります。 これにより、各手法が冗長な入力フィーチャを識別して削除する機会が得られます。

pseudorandom number generatorの固定乱数シードにより、コードが実行されるたびに同じ合成データセットが生成されます。

An example of creating and summarizing the synthetic classification dataset is listed below.

1
2
3
4
5
6

# synthetic classification dataset
from sklearn.データセットのインポートmake_classification
#データセットを定義
X,y=make_classification(n_samples=1000,n_features=20,n_informative=10,n_redundant=10,random_state=7)
#データセットを要約する
print(X.shape,y.shape)

この例を実行すると、データセットが作成され、期待に一致する行と列の数がレポートされます。

1
(1000, 20) (1000,)

It is a binary classification task and we will evaluate a LogisticRegression model after each dimensionality reduction transform.

モデルは、繰り返し層別化された10倍交差検証の金本位を使用して評価されます。 すべての折り目と繰り返しの平均と標準偏差の分類精度が報告されます。

次の例では、生のデータセットのモデルを比較のポイントとして評価します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
#生データのロジスティック回帰モデルを評価する

numpyから平均をインポート
numpyから
sklearnからstd
をインポートします。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the model
model = LogisticRegression()
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、20列すべての生データセットのロジスティック回帰が評価され、約82.4パーセントの分類精度が得られます。

このデータに対する次元削減変換が成功すると、このベースラインよりも精度の高いモデルが生成されますが、これはすべての手法で可能ではあ注:このデータセットを「解決」しようとしているのではなく、出発点として使用できる実際の例を提供しています。

1
Accuracy: 0.824 (0.034)

Next, we can start looking at examples of dimensionality reduction algorithms applied to this dataset.

I have made some minimal attempts to tune each method to the dataset. 各次元削減方法は、可能であれば20個の入力列を10個に削減するように構成されます。

パイプラインを使用して、データ変換とモデルを結合し、交差検証手順を使用して評価できるアトミック単位にします。:

1
2
3
4

# define the pipeline
steps =
model = Pipeline(steps=steps)

Let’s get started.

Can you get a better result for one of the algorithms?
以下のコメントでお知らせください。

主成分分析

主成分分析、またはPCAは、高密度データ(ゼロ値が少ない)を使用した次元削減のための最も一般的な手法である可能性があります。PCAの仕組みの詳細については、チュートリアルを参照してください。

  • Pythonで最初から主成分分析(PCA)を計算する方法

scikit-learnライブラリは、次元削減データ変換として使用できる主成分分析のPCAクラス実装を提供しています。 引数”n_components”は、変換の出力で必要な次元の数を設定するために設定できます。PCA次元削減を使用してモデルを評価する完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
17
18
19
#ロジスティック回帰アルゴリズムでpcaを評価する numpyインポートからの分類
平均
numpyインポートstd
sklearnから。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。パイプラインsklearnからパイプライン
をインポートします。分解sklearnからPCA
をインポートします。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the pipeline
steps =
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、次元削減とロジスティック回帰予測モデルを使用してモデリングパイプラインを評価します。注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いを考えると、結果は異なる場合があります。

注:結果は異なる場合があります。

注: この例を数回実行し、平均結果を比較することを検討してください。この場合、PCA変換を使用する際のモデルパフォーマンスの向上は見られません。

1
Accuracy: 0.824 (0.034)

Singular Value Decomposition

Singular Value Decomposition, or SVD, is one of the most popular techniques for dimensionality reduction for sparse data (data with many zero values).

SVDがどのように機能するかの詳細については、チュートリアルを参照してください。

  • PYTHONで最初からSVDを計算する方法

scikit-learnライブラリは、次元削減データ変換として使用できる特異値分解のTruncatedSVDクラス実装を提供しています。 引数”n_components”は、変換の出力で必要な次元の数を設定するために設定できます。SVD次元削減を使用してモデルを評価する完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
17
18
19
#svdをロジスティック回帰アルゴリズムで評価する numpyインポートからの分類
平均
numpyインポートstd
sklearnから。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。パイプラインsklearnからパイプライン
をインポートします。分解sklearnからTruncatedSVD
をインポートします。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the pipeline
steps =
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、次元削減とロジスティック回帰予測モデルを使用してモデリングパイプラインを評価します。注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いを考えると、結果は異なる場合があります。

注:結果は異なる場合があります。

注: この例を数回実行し、平均結果を比較することを検討してください。この場合、SVD変換を使用する際にモデルのパフォーマンスが向上することはありません。

1
Accuracy: 0.824 (0.034)

Linear Discriminant Analysis

Linear Discriminant Analysis, or LDA, is a multi-class classification algorithm that can be used for dimensionality reduction.

投影の次元の数は1とC-1に制限されています。Cはクラスの数です。 この場合、データセットは二値分類問題(2つのクラス)であり、次元の数を1に制限します。

次元削減のためのLDAの詳細については、チュートリアルを参照してください。

  • Pythonの次元削減のための線形判別分析

scikit-learnライブラリは、次元削減データ変換として使用できる線形判別分析のLinearDiscriminantAnalysisクラス実装を提供しています。 引数”n_components”は、変換の出力で必要な次元の数を設定するために設定できます。

LDA次元削減を使用してモデルを評価する完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
17
18
19
#ロジスティック回帰アルゴリズムでldaを評価する numpyインポートからの分類

平均
numpyインポートstd
sklearnから。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。パイプラインsklearnからパイプライン
をインポートします。discriminant_analysis sklearnからLinearDiscriminantAnalysis
をインポートします。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the pipeline
steps =
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、次元削減とロジスティック回帰予測モデルを使用してモデリングパイプラインを評価します。注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いを考えると、結果は異なる場合があります。

注:結果は異なる場合があります。

注: この例を数回実行し、平均結果を比較することを検討してください。

この場合、生データのベースライン適合と比較して、パフォーマンスがわずかに向上していることがわかります。

1
Accuracy: 0.825 (0.034)

Isomap Embedding

Isomap Embedding, or Isomap, creates an embedding of the dataset and attempts to preserve the relationships in the dataset.scikit-learnライブラリは、次元削減データ変換として使用できるIsomap埋め込みのIsomapクラス実装を提供します。 引数”n_components”は、変換の出力で必要な次元の数を設定するために設定できます。SVD次元削減を使用してモデルを評価する完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
17
18
19
#isomapをロジスティック回帰アルゴリズムで評価する numpyインポートからの分類

平均
numpyインポートstd
sklearnから。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。パイプラインsklearnからパイプライン
をインポートします。マニホールドインポートIsomap
sklearnから。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the pipeline
steps =
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、次元削減とロジスティック回帰予測モデルを使用してモデリングパイプラインを評価します。注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いを考えると、結果は異なる場合があります。

注:結果は異なる場合があります。

注: この例を数回実行し、平均結果を比較することを検討してください。この場合、Isomapデータ変換では、生データのベースライン適合と比較して、パフォーマンスが向上していることがわかります。

この場合、Isomapデータ変換では、生データのベース

1
Accuracy: 0.888 (0.029)

Locally Linear Embedding

Locally Linear Embedding, or LLE, creates an embedding of the dataset and attempts to preserve the relationships between neighborhoods in the dataset.

scikit-learnライブラリは、次元削減データ変換として使用できる局所線形埋め込みのLocalallylinearembeddingクラス実装を提供します。 引数”n_components”は、変換の出力で必要な次元の数を設定するために設定できます

LLE次元削減を使用したモデルの評価の完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
17
18
19
#タクソノミのlleとロジスティック回帰を評価する
#div>

numpyからインポート平均
numpyからインポートstd
sklearnから。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。パイプラインsklearnからパイプライン
をインポートします。div>

をsklearnからインポートします。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the pipeline
steps =
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、次元削減とロジスティック回帰予測モデルを使用してモデリングパイプラインを評価します。注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いを考えると、結果は異なる場合があります。

注:結果は異なる場合があります。

注: この例を数回実行し、平均結果を比較することを検討してください。この場合、生データのベースライン適合と比較して、LLEデータ変換のパフォーマンスが向上していることがわかります。

1
Accuracy: 0.886 (0.028)

Modified Locally Linear Embedding

Modified Locally Linear Embedding, or Modified LLE, is an extension of Locally Linear Embedding that creates multiple weighting vectors for each neighborhood.

scikit-learnライブラリは、次元削減データ変換として使用できる修正された局所線形埋め込みのLocalallylinearembeddingクラス実装を提供します。 “Method”引数は’modified’に設定する必要があり、”n_components”引数は”n_neighbors”引数よりも小さくなければならない変換の出力で必要な次元の数を設定するように設定できます。

変更されたLLE次元削減を使用してモデルを評価する完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19

11

12
13
14
15
16
17
18
19
#変更されたlleとロジスティック回帰を評価します numpyインポートからの分類
平均
numpyインポートstd
sklearnから。データセットは、sklearnからmake_classification
をインポートします。model_selection sklearnからcross_val_score
をインポートします。model_selection sklearnからRepeatedStratifiedKFold
をインポートします。パイプラインsklearnからパイプライン
をインポートします。div>

をsklearnからインポートします。linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=10, random_state=7)
# define the pipeline
steps =
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring=’accuracy’, cv=cv, n_jobs=-1)
# report performance
print(‘Accuracy: %.3f (%.3f)’%(mean(n_scores),std(n_scores)))

この例を実行すると、次元削減とロジスティック回帰予測モデルを使用してモデリングパイプラインを評価します。注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いを考えると、結果は異なる場合があります。

注:結果は異なる場合があります。

注: この例を数回実行し、平均結果を比較することを検討してください。

この場合、変更されたLLEデータ変換では、生データのベースライン適合と比較してパフォーマンスが向上していることがわかります。

1
Accuracy: 0.846 (0.036)

Further Reading

This section provides more resources on the topic if you are looking to go deeper.

チュートリアル

  • 機械学習のための次元削減の紹介
  • Pythonの次元削減のための主成分分析
  • Pythonの次元削減のための特異値分解
  • Pythonの次元削減のための線形判別分析

Api

  • コンポーネント内の信号を分解する、scikit-learn API。
  • マニホールド学習、scikit-LEARN API。

Summary

このチュートリアルでは、Pythonでトップ次元削減アルゴリズムを近似して評価する方法を発見しました。具体的には、次のことを学びました。

  • 次元削減は、データ内の顕著な関係を保持する数値入力データの低次元表現を求めます。
  • 多くの異なる次元削減アルゴリズムがあり、すべてのデータセットに対して単一の最良の方法はありません。scikit-learn machine learningライブラリを使用してPythonでトップ次元削減を実装、適合、および評価する方法。

何か質問がありますか?

質問がありますか?
以下のコメントであなたの質問をすると、私は答えるために最善を尽くします。P>

現代のデータ準備のハンドルを取得!

機械学習のためのデータ準備

機械学習データを数分で準備します

。..pythonコードのわずか数行で

どのように私の新しい電子ブックで発見:
機械学習のためのデータ準備

それは上の完全な作業コードと自習チュートリア..

あなたの機械学習プロジェクトに現代のデータ準備技術をもたらす

内部のものを見る

ツイート共有共有

コメントを残す

メールアドレスが公開されることはありません。