🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4251閲覧

主成分回帰、PLS回帰のモデル保存/呼び出しについて

sssan

総合スコア10

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/26 14:05

現在X線回析やNMRのような連続値を持つ多次元のスペクトルデータの解析を主成分分析等を用いて行っています。

[やりたいこと]
42次元のスペクトルデータと物性Aの間の関係性を機械学習し、新規データに対して予測値を得たい。
[困っていること]
下記コードのように主成分回帰後のモデルをpicleで保存/呼び出しして新たなデータ(newdata.csv)に対してpredictしたが、
新規データは次元圧縮していないので以下のエラーが出る。

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 6 is different from 42)

[知りたいこと]
1.主成分回帰やPLS回帰後のモデル保存はpicleで可能なのか?他の方法があるのか?
2.新規データの次元圧縮はどのように行うべきか?

python

1import pandas as pd 2import numpy as np 3import os 4import glob 5from pathlib import Path 6from sklearn.preprocessing import StandardScaler 7from sklearn.model_selection import train_test_split 8from sklearn.linear_model import LinearRegression 9from sklearn.decomposition import PCA 10import random 11import pickle 12 13np.random.seed(1) 14random.seed(1) 15 16#csvファイル取得 17program_dir = Path(__file__).parent.resolve() 18totaldata_dir = program_dir / 'Trainingdata.csv' 19totaldata = pd.read_csv(totaldata_dir, index_col=0, encoding='utf-8') 20 21#データ前処理 22X_ = totaldata.drop('A', axis=1) 23y_ = pd.DataFrame(totaldata['A'], columns=['A']) 24 25X_std = StandardScaler().fit_transform(X_) 26X_std = pd.DataFrame(X_std, columns=X_.columns) 27 28n_train_rate = 0.7 29train_X_data, test_X_data, train_y_data, test_y_data = train_test_split(X_std, y_, test_size=1-n_train_rate) 30 31#PCA 32pca = PCA(n_components=6) 33X_train_pca = pca.fit_transform(train_X_data) 34X_test_pca = pca.transform(test_X_data) 35 36#LinearRegression 37linear_model = LinearRegression() 38linear_model.fit(X_train_pca, train_y_data) 39 40#モデル保存 41filename = 'predict_model.sav' 42pickle.dump(linear_model, open(filename, 'wb')) 43 44#モデル呼び出し 45modelname = 'predict_model.sav' 46predictedmodel = pickle.load(open(modelname, 'rb')) 47 48#新規csvデータ読み込み(*新規csvデータには物性Aの列は存在しない) 49newdata_dir = program_dir / 'newdata.csv' 50newdata_X = pd.read_csv(newdata_dir, index_col=0, encoding='utf-8') 51 52#予測値出力 53print('Predict value:', predictedmodel.predict(newdata_X))

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

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

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

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

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

guest

回答1

0

ベストアンサー

scikit-learnで次元削減→予測など、複数モデルの結果を組み合わせて使いたい場合はPipelineを使ってください。

sklearn.pipeline.Pipeline — scikit-learn 0.24.1 documentation

python

1# 追加しとく 2from sklearn.pipeline import make_pipeline 3 4# ... 5 6#データ前処理 7X_ = totaldata.drop('A', axis=1) 8y_ = pd.DataFrame(totaldata['A'], columns=['A']) 9 10n_train_rate = 0.7 11train_X_data, test_X_data, train_y_data, test_y_data = train_test_split(X_std, y_, test_size=1-n_train_rate) 12 13# モデル作る 14scaler = StandardScaler() 15pca = PCA(n_components=6) 16linear_model = LinearRegression() 17model = make_pipeline(scaler, pca, linear_model) 18 19# 学習 20model.fit(train_X_data, train_y_data) 21 22#モデル保存 23filename = 'predict_model.sav' 24pickle.dump(model, open(filename, 'wb'))

といった感じでやります。

投稿2021/01/27 12:28

hayataka2049

総合スコア30935

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

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

sssan

2021/01/27 13:28

ご回答頂きありがとうございます。 複数の処理、モデル使用時にはPipelineを使用することを知りませんでした。助かります。 この保存したモデルを新規データセットに対して使用したい場合、 新規データの次元圧縮はどのように行うべきでしょうか? モデル作成時の教師データでPCAを行った時と新規データのみにPCAしたときでローディングが変わってくる気がします。 お手数をおかけしますがよろしくお願い致します。
hayataka2049

2021/01/27 13:38

やることは、「保存したモデルを読み込んでから、新規データセットを次元圧縮せずにモデルに投入」、です。 中でなにやっているのか説明しておくと、まあたとえばPCAで前処理したのであれば 学習の際に写像(行列)がモデル内部で保持されており、 予測の際はそれに従って変換する、 という挙動です。 もう少し一般化して言うと、前処理用の(一番最後のモデル以外の)モデルは、学習時はfit_transformしてて、予測時はtransformになる訳です。最終段は学習時がfitで予測時がpredictですね。
sssan

2021/01/27 14:02

ご回答頂きありがとうございます。 説明非常にわかりやすく、参考になりました。 コードも無事実行できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問