質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

2回答

1652閲覧

異なるデータセットのscikit-learnを使った次元削減に関して

d.goto

総合スコア84

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/01/24 09:45

前提・実現したいこと

学習用のAのデータセットと、予測したいBのデータセットを用意しました。
Aのデータセットは26995個のデータが入っており、Bのデータセットは100個のデータが入っています。
それぞれのデータセットの次元は、3072次元です。

Aのデータセットの次元削減したデータを学習させたモデルをサーバーに保存しておき、
そのモデルをBのデータセットの予測に使用したいと思っています。

Bのデータセットの予測のときに、Aのデータセットの次元削減と同じパラメータで、次元削減を行っているのですが、
異なる分布になっているようで、うまく予測ができない状態となっています。

当方初心者なので、エラーが出ていればそこの修正をすればいいのですが、どこを直したら良いのかもわからずです。。。
すみませんが、どなたかご教示いただけますと幸いです。

次元削減を行っているソースコード

ABそれぞれのデータセットの次元削減で下記の関数を使用しています。

python

1from sklearn.decomposition import PCA 2 3#データを投げると、10次元に削減したデータを返す関数 4def dimensionality_reduction(self, data): 5 pca = PCA(n_components=10, random_state=510, svd_solver="full") 6 data_pca = pca.fit_transform(data) 7 return data_pca

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/01/24 09:51 編集

Aのデータを fit_transform() したあと、Bのデータは学習済みのPCAオブジェクトを使って transform() していますか? つまり、Bのデータで fit_transform() を呼び出していたりしないでしょうか?
d.goto

2019/01/24 10:06

ご回答くださいましてありがとうございます。 おっしゃる通り、Bのデータでfit_transform()を呼び出しておりました。 ドキュメント読んでみると、fitとtransformがそれぞれあるようなのですが、 AのデータセットをfitさせたPCAオブジェクトをダンプしておいてBのデータセットの次元削減時に ダンプしたPCAオブジェクトを読み込んで使用するということでしょうか・・・?
tiitoi

2019/01/24 10:32

回答に記載しました。
guest

回答2

0

ベストアンサー

以下のように学習データで fit_transform() したら、テストデータでは transform() で変換します。

python

1import matplotlib.pyplot as plt 2import seaborn as sns 3from sklearn.datasets import load_iris 4from sklearn.decomposition import PCA 5from sklearn.linear_model import LogisticRegression 6from sklearn.metrics import accuracy_score 7from sklearn.model_selection import train_test_split 8 9sns.set(style='dark') 10 11iris = load_iris() 12 13# 学習データ、テストデータに分割する。 14x_train, x_test, y_train, y_test = train_test_split( 15 iris.data, iris.target, stratify=iris.target, test_size=0.2) 16 17pca = PCA(n_components=2) 18classifier = LogisticRegression(solver='lbfgs', multi_class='multinomial') 19 20# 学習データに対して、主成分分析を行う。 21x_train_trans = pca.fit_transform(x_train) 22# 学習する。 23classifier.fit(x_train_trans, y_train) 24 25# テストデータを変換する。 26x_test_trans = pca.transform(x_test) 27# 推論する。 28y_pred = classifier.predict(x_test_trans) 29# 精度計算 30acc = accuracy_score(y_test, y_pred) 31print('{:.2%}'.format(acc)) # 96.67% 32 33# 描画する。 34sns.scatterplot(x_train_trans[:, 0], x_train_trans[:, 1], hue=y_train) 35plt.show() 36 37sns.scatterplot(x_test_trans[:, 0], x_test_trans[:, 1], hue=y_test) 38plt.show()

学習データ PCA済み
イメージ説明

テストデータ PCA済み
イメージ説明

学習結果を保存、読み込みする必要がある場合は pickle を使ってください

scikit-learn: Save and Restore Models

投稿2019/01/24 10:30

tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

d.goto

2019/01/25 03:26

ご回答ありがとうございました! おかげさまで無事にやりたいことができました! ありがとうございました!
guest

0

基本的にはtiitoiさんの回答の通りですが、補足的な情報を追加しておくと、

scikit-learnにはPipelineというクラスがあり、こちらを用いると「次元削減→予測」のような処理をまとめて1つのモデルとして取り扱えます。fit, transform, fit_transformといったメソッドも内部的にうまく使い分けてくれます。

次元削減するモデルと予測するモデルとを別々にダンプして使うよりスマートなので、こちらの利用もご検討ください。

sklearn.pipeline.Pipeline — scikit-learn 0.20.2 documentation

投稿2019/01/24 14:32

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

d.goto

2019/01/25 03:28

ご回答ありがとうございました! 今回はtiitoi様のほうがご回答が早かったためtiitoi様のご回答をベストアンサーにさせていただきましたが、 hayataka2049様のご回答のおかげで次元削減のモデルをダンプできることに気が付きました! ありがとうございました!
d.goto

2019/01/25 03:35

また、Pipelineというクラスの情報もご教示いただきましてありがとうございました! こちらに関しては、まだまだ使いこなせそうにないかなーと思いまして、今回は使用を見送ろうと思います。 ただ、そんなことができるということを頭に入れておくだけで、将来的になにかの役に立つかとも思うので、今後使いそうなタイミングでもう少し詳しく調べてみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問