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

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

詳細はこちら
機械学習

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

Python

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

Q&A

解決済

2回答

1952閲覧

サポートベクターマシンで作成したモデルを再利用すると結果が変わってしまう。

python_2019

総合スコア68

機械学習

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

Python

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

0グッド

1クリップ

投稿2019/10/03 04:57

編集2019/10/04 00:39

サポートベクターマシンで学習済のモデルを、再利用すると、結果が異なってしまいます
([0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 ]などの2値結果です)。

データは同じなのですが、なぜでしょうか?
以下、PGMの全文です。結果(2値)も掲示しました。

ご指導頂ければ助かります。

----
①学習→学習済モデルを保存→ロード→未知データで結果確認
(ロジスティック回帰分析→サポートベクターマシンの順番で処理しています。)
----

from

1import pandas as pd 2 3# エクセルの入力ファイル名、シート名を指定 4df_X = pd.read_excel('target+notarget.xlsx',sheet_name='説明変数') 5df_Y = pd.read_excel('target+notarget.xlsx',sheet_name='目的変数') 6 7# 読み込んだデータを表示する 8df_X.head() 9 10# 条件のデータを表示する 11df_Y.head() 12 13#訓練データと評価用データに分割 14from sklearn.model_selection import train_test_split as split 15x_train, x_test, y_train, y_test = split(df_X,df_Y,train_size=0.8,test_size=0.2) 16 17#教師あり学習の実行(ロジスティック回帰) 18from sklearn.linear_model import LogisticRegression 19model= LogisticRegression() 20model.fit(x_train,y_train) 21 22# 評価と精度の計算 23from sklearn import metrics 24 25#評価の実行 26y_pred = model.predict(x_test) 27 28# 精度の計算 29print(metrics.accuracy_score(y_test,y_pred)) 30 31# ここから、SVM 32 33# scikit-learn ライブラリの読み込み 34from sklearn import datasets 35 36# 学習器の作成。SVMというアルゴリズムを選択 37from sklearn import svm 38clf = svm.SVC() 39 40# 訓練データとラベルで学習 41clf.fit(x_train, y_train) 42 43# テストデータで試した正解率を返す   44accuracy = clf.score(x_test, y_test) 45print(f"正解率⇒ {accuracy}") 46 47正解率⇒ 0.825 48classification report 49 precision recall f1-score support 50 51 0 0.00 0.00 0.00 7 52 1 0.82 1.00 0.90 33 53 54 accuracy 0.82 40 55 macro avg 0.41 0.50 0.45 40 56weighted avg 0.68 0.82 0.75 40 57 58# 学習済モデルを使ってテストデータを分類した結果を返す 59predicted = clf.predict(x_test) 60 61# 詳しいレポート 62# precision(適合率): 選択した正解/選択した集合 63# recall(再現率) : 選択した正解/全体の正解 64# F-score(F値) : 適合率と再現率はトレードオフの関係にあるため 65print("classification report") 66print(metrics.classification_report(y_test, predicted)) 67 68# モデルを保存する 69import pickle 70 71filename = 'ERP(SVM).sav' 72pickle.dump(model, open(filename, 'wb')) 73 74# 保存したモデルをロードする 75loaded_model = pickle.load(open(filename, 'rb')) 76 77# 未知データを学習済モデル(SVM)で分類 78 79import numpy as np 80df1 = pd.read_excel('target+notarget_未知.xlsx',sheetname='説明変数')# 未知データのエクセル読み込み 81X_pred = np.array(df1) 82y_pred = clf.predict(X_pred)# 学習済モデル(SVM)を使って分類(0、1) 83print(X_pred,y_pred) 84 85C:\python\anaconda\pgm\lib\site-packages\pandas\util\_decorators.py:188: FutureWarning: The `sheetname` keyword is deprecated, use `sheet_name` instead 86 return func(*args, **kwargs) 87[[ 10.07129 11.51457 11.76082 ... -8.489728 -8.04093 88 -7.381762 ] 89 [ -1.14947 0.02524982 1.102695 ... -10.32178 -13.35207 90 -14.82256 ] 91 [ 2.846096 3.02329 2.520598 ... 3.910414 6.817744 92 8.904238 ] 93 ... 94 [ 0.4724252 -1.992815 -3.942807 ... 0.5846236 0.8689489 95 0.7559054 ] 96 [ 3.245025 3.993944 4.170406 ... -3.836895 -6.829057 97 -9.500171 ] 98 [ 3.627492 4.49755 4.667884 ... -11.4468 -10.76785 99 -9.549679 ]] [0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 100 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 101 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 103 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 104 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

----
②学習済モデルを再利用(読み込み)して、同じ未知データで結果確認
----

import

1 2# 学習済モデル(SVM)のロード(読み込み)(モデルはすでに保存済) 3with open('ERP(SVM).sav', mode='rb') as fp: 4 clf = pickle.load(fp) 5 6import numpy as np 7import pandas as pd 8 9# 未知データの読み込み 10df1 = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数') 11x_test_michi = np.array(df1) 12 13# 未知データをロードした学習済モデルで予測 14y_test_michi = clf.predict(x_test_michi) 15 16print(x_test_michi,y_test_michi) 17 18[[ 10.07129 11.51457 11.76082 ... -8.489728 -8.04093 19 -7.381762 ] 20 [ -1.14947 0.02524982 1.102695 ... -10.32178 -13.35207 21 -14.82256 ] 22 [ 2.846096 3.02329 2.520598 ... 3.910414 6.817744 23 8.904238 ] 24 ... 25 [ 0.4724252 -1.992815 -3.942807 ... 0.5846236 0.8689489 26 0.7559054 ] 27 [ 3.245025 3.993944 4.170406 ... -3.836895 -6.829057 28 -9.500171 ] 29 [ 3.627492 4.49755 4.667884 ... -11.4468 -10.76785 30 -9.549679 ]] [0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 31 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 32 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 33 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 34 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 35 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0] 36 37コード

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

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

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

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

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

t_obara

2019/10/03 06:11

よくわかりませんが、print(X_pred,y_pred)の結果とprint(x_test_michi,y_test_michi)の結果が異なっているのが問題なのですか?
python_2019

2019/10/03 07:35

ご指導ありがとうございます。 はい、ご指摘の通りです。 同じモデルを使用して、同じデータを解析したのに、両方の結果が異なってしまうのです。 もし、原因をお教え頂ければ助かります。 よろしくお願いいたします。
t_obara

2019/10/03 07:43

提示されている情報がよく理解できませんが、 入力であるX_predとx_test_michiが異なっている(ように見える)ので、同じモデルでも出てくる結果が異なるのでは?
python_2019

2019/10/03 08:13

ご連絡ありがとうございます。 今、X_predとx_test_michiを同じにしてみたのですが、やはり異なる結果になってしまいます...。
Kapustin

2019/10/03 13:58

これはソースコード全文ですか? ◆学習→学習済モデルを保存→ロード→未知データで結果確認 の方の y_pred = clf.predict(X_pred)# 学習済モデル(SVM)を使って分類(0、1) で出てくる clf はこの段階では定義されていないかと思います。 また、コードを記載する時は ``` コード内容 ``` と書くと読みやすくなります。(<code> コードの挿入を押すと出てきます)
python_2019

2019/10/03 14:26

ご指導ありがとうございます。 <code>の挿入方法があるのを知りませんでした。 確かに読みやすくなりますね。 ソースコードは全文ではありません。 clfの定義は、前の方の行で以下のように記述しています。 もしかしたら、このclfの使い方で、異なる結果になってしまうのでしょうか? 理解不足で申し訳ありません。 よろしく願いします。 --- # scikit-learn ライブラリの読み込み from sklearn import datasets from sklearn import svm clf = svm.SVC()
Kapustin

2019/10/03 14:36 編集

「ロード→未知データで結果確認」 という部分の流れが上記のソースコードだけでは確認できませんでした。 質問内容は編集できるので、見やすいよう整理しながらできれば該当箇所の全てを掲載してください。 何かしらの事情で掲載できなければ、「学習済モデルを再利用(読み込み)して、同じ未知データで結果確認」だけを何度か試し、結果が常に同じなっているか確認してみてください。 ・結果が全て一致 > 学習→学習済モデルを保存→ 「ロード→未知データで結果確認」 の部分に問題がありそうです ・結果が違う > モデルのロード方法やライブラリの使用方法が違う可能性があります。 SVMは学習後の結果は基本的には変わらないはずなので。。
nandymak

2019/10/03 15:01

他の方の指摘通り全コードをMarkdown形式で提示してください。 clf.fit(x,y)の部分も見てみたいです。
python_2019

2019/10/04 00:42

ご連絡ありがとうございます。 ご指摘のとおり、コードの全文を開示いたしました。 ①学習→学習済モデルを保存→ロード→未知データで結果確認  ここでは、先にロジスティック回帰分析を実施して、それからサポートベクターマシンを実施しています。もしかしたら、このロジスティック回帰分析を先に実行していることが、サポートベクターマシンのモデル保存処理に影響しているのでしょうか?  引き続き、ご指導いただければ、大変助かります。  よろしくお願いいたします。
t_obara

2019/10/04 01:02

保存しているのはロジスティック回帰モデルのようです。SVMは毎回作り直しなので、保存するならclfの方では?
python_2019

2019/10/04 14:26

ご指導ありがとうございます。 clfにすると、結果の値が同じになりました。 どうもありがとうございました。 助かりました。
guest

回答2

0

ベストアンサー

python

1#教師あり学習の実行(ロジスティック回帰) 2from sklearn.linear_model import LogisticRegression 3model= LogisticRegression() 4model.fit(x_train,y_train) 5 6(省略) 7 8# モデルを保存する 9import pickle 10 11filename = 'ERP(SVM).sav' 12pickle.dump(model, open(filename, 'wb'))

python

1# 学習済モデル(SVM)のロード(読み込み)(モデルはすでに保存済) 2with open('ERP(SVM).sav', mode='rb') as fp: 3 clf = pickle.load(fp)

ERP(SVM).savに保存された学習済みモデルはLogisticRegression()ですね。
「clf = svm.SVC()」を保存しましょう。

python

1# モデルを保存する 2import pickle 3 4filename = 'ERP(SVM).sav' 5pickle.dump(clf, open(filename, 'wb'))

投稿2019/10/04 01:21

nandymak

総合スコア799

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

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

0

上のコードは、modelを保存して、別に訓練したclfを表示。
下のコードは、clfに読み込んで表示。
つまり、別のものを比べているように見えます。

投稿2019/10/04 01:01

Q71

総合スコア995

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

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

python_2019

2019/10/04 14:29

ご指摘ありがとうございます。 clfにすると、上手く行きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問