• 締切済み

Scikit-learnを利用してデータの分類

Scikit-learnを利用してデータの分類を行いたいと考えております。 ★検証したいこと マスタデータの名称、大分類CDを元に小分類CDを予測する 現状で実現できたこと ・学習モデルを生成(MLPClassifier)/保存 ・分類対象データを訓練データ/テストデータに分割 ・fitを利用して学習 ・predictを利用してテストデータの予測  ※精度は65%程度   実現できないこと ・ロードした学習モデルを呼び出して新たな分類対象データを  もとにpredictを行うと予測結果の精度が低い(1件も正しい予測がされない) 基本的な知識が欠落していることも想定され、大変恐縮ですが、ご存じの方がいらっしゃればご教授頂けますと幸いです。 yosoku.py ========================================== import os import sys # パラメータ渡しに必要 # [Scikit-learn] [サイキットラーン]機械学習ライブラリ from sklearn import datasets # サンプルのデータ from sklearn.neural_network import MLPClassifier # [ニューラルネットワーク]アルゴリズム from sklearn.model_selection import train_test_split # 訓練データ】と【テストデータ】を簡単に分けることができるライブラリ import sklearn as skl # [サイキットリーン]機械学習用ライブラリ import numpy as np # [ナンパイ]数値計算用ライブラリ import pandas as pd # [パンダス]データ解析ライブラリ import matplotlib.pyplot as plt # [マットプロットリブ]画像描画用のライブラリ import joblib as job # 学習モデルの保存/ロード #from sklearn.externals import joblib # 学習モデルの保存/ロード from datetime import datetime debug = "1" # DEBUGモード 0:ログ出力なし 1:ログ出力あり Dip_Glaf = "1" # グラフモード 0:なし 1:表示あり if debug == "1": print('*****************商品分類 予測 開始*****************') ret = "0" # 戻り値 try: filename = 'Hin_Bunrui_model_' filename = filename + datetime.now().strftime('%Y%m%d') + 'sav' df = pd.read_csv('test_BUNRUI_20620_2_kensyou.csv', encoding='shift_jis') # 品名を10新数に変換する事である程度法則性を持った値となるため品名も機械学習に有益となる print('*******品名10新数変換*********') for index, row in df.iterrows(): str_wk = row['HIN_NAME'] # DataFrameの品名を変数にセット str_wk2 = str_wk.encode('utf-8', 'replace').hex() # 品名を16新数に変換 [0x99のような形式] df.at[index, 'HIN_NAME'] = int(str_wk2,16) # 16新数の品名を10新数に変換しdataFrameを更新 #------------------------------------------------------------------------------ # 文字列カテゴリーを数値化する #------------------------------------------------------------------------------ #print('[HIN_NAME_SUB]の数値化') data = pd.factorize(df.iloc[: , 3]) df["HIN_NAME_SUB"] = data[0] # 0列目に変換後の値 1列目に変換前の値 #print('[HIN_NAME_SUB2]の数値化') data = pd.factorize(df.iloc[: , 4]) df["HIN_NAME_SUB2"] = data[0] # 0列目に変換後の値 1列目に変換前の値 print('[BUNRUI_SYO_NM]の数値化') data = pd.factorize(df.iloc[: , -1]) df["BUNRUI_SYO_NM"] = data[0] # 0列目に変換後の値 1列目に変換前の値 skl_Data = skl.utils.Bunch() # [target]目的変数[正解ラベル]にCSVデータの[Bunrui](分類CD)をセット skl_Data['target'] = df['BUNRUI_SYO'] print("***** 正解ラベル セット完了 [BUNRUI_SYO][小分類CD] *****") skl_Data['data'] = df.loc[:, ['HIN_NAME_SUB','HIN_NAME_SUB2', 'HIN_KBN', 'BUNRUI_DAI', 'BUNRUI_CHU' ]] skl_Data['feature_names'] = [ 'HIN_NAME_SUB','HIN_NAME_SUB2', 'HIN_KBN', 'BUNRUI_DAI', 'BUNRUI_CHU' ] if os.path.isfile(filename): print("ロード") # ★機械学習モデルが存在する場合はロード clf = job.load(filename) else: # ★機械学習モデルが存在しない場合は新規作成 print("新規作成") clf = MLPClassifier(hidden_layer_sizes=10, activation='relu',solver='adam', max_iter=500) print("予測 ") # 戻り値で予測結果を戻す [skl_Data['target'] = df['Bunrui']]なので分類CDが戻る print(clf.predict(skl_Data['data'])) # 戻り値で予測結果を戻す [skl_Data['target'] = df['Bunrui']]なので分類CDが戻る print("正解 ") print(df["BUNRUI_SYO"]) except Exception as E: sys.exit() # 処理終了 # 戻り値格納(正常終了) print("Result {0}".format(ret))

  • Python
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

データの分類問題に取り組む際、学習したモデルを適切にロードし、新たなデータに対する予測精度を高めることは重要なステップです。ご提供いただいた情報を基に、下記の提案をさせていただきます。 まずは、モデルのロードが正確に行われているかを確認しましょう。学習済みモデルをロードする際、そのモデルが生成された時の環境と整合性が必要です。ファイル名が日付によって変わる設計なので、正しいファイルを指定していることを確認してください。また、学習時と同じ前処理が新たなデータにも施されているかも重要です。 新たなデータに対する予測精度が低いという点に関しては、以下の点を考慮する必要があります。 1. 新たなデータに対する適切な前処理:学習データと同じ手順で前処理がなされているかを確認してください。特に、カテゴリ変数の数値への変換(エンコーディング)が一貫している必要があります。 2. データの分布: 学習データと新たなデータが同じ分布から来ているかを確認してください。もし分布が異なる場合、学習したモデルが上手く機能しないことがあります。 3. モデルの汎化性能: 65%の精度であることから、更なるモデルの調整が必要かもしれません。過学習を防ぐための正則化の適用や、異なるアルゴリズムへの変更を検討して見てはいかがでしょうか。 最後に、モデルパフォーマンスが予想よりも低い場合、以下のような手順を検討してください。 - クロスバリデーションなどによるモデルの評価を行い、モデルが適切に学習できているかを再度確認する。 - パラメータチューニングを行い、ハイパーパラメータの最適な組み合わせを見つける。 - 特徴選択を行い、不必要な特徴量を削減し、モデルの複雑さを下げる。 - 異なるモデルを試し、ベストなものを選択する。 非常に基本的なポイントかもしれませんが、上記の点を確認されることをお勧めします。データ分析は試行錯誤のプロセスですので、様々なアプローチを試してみてください。ご不明な点がありましたら、お気軽にお尋ねください。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

関連するQ&A

  • accessデータ活用法

    編集方法で悩んでおります。 受注テーブル ID オートNo. 品名 テキスト 数量 数値 品名テーブル ID オートNo. 品名 テキスト とあるとします。 テーブル同士は、リレーションはされておらず、 受注フォームのリストボックスのコントロールソースに品名テーブルが参照されています。 今回、品名を分類コードで仕訳したいのですが... せっかく品名が入力されているのでそれを引用したいです。 そこで、 (1)新たに分類テーブルを作成し組込む (2)品名テーブルの行を増やし、分類コードのフィールド追加 (3)品名を置換えや条件分岐関数で分類コードに変換 ちなみに、品名/分類は10種類以内です。 (1)(2)はいろいろ試しましたが、受注テーブルの既存データのクエリ結果が得られません。 そもそも、考えが間違ってるでしょうか??? 宜しくお願いします。

  • シングルコーテーションのデータ受渡し方法

    現在PHPとMySQLで初めてシステムの作成をしていて、データの受渡し方に悩んでいます。 FormでPOSTのデータの「'」の受渡しで、現在はPHP内で $body .= "<FORM NAME='objform' ACTION='form_check.php' METHOD='POST'> <INPUT TYPE='hidden' NAME='name' VALUE='$name'></FORM>" のようにすると、$nameに途中に「'」が入ってしまった場合、途中で切れた文字が受け渡されてしまいます。 そこで、 print <<< EOF <FORM NAME="objform" ACTION="form_check.php" METHOD="POST"> <INPUT TYPE="hidden" NAME="bunrui" VALUE="$bunrui"> </FORM> EOF; のようにして、受渡しは出来たのですが、Javascriptの併用で、 <input type="button" value="編集" onclick="EditExec('$name', '$namae_cd');"> のように、引数を複数渡す時に「'」を使うとjavascriptが動かなくなってしまいました。 皆さんはデータ受渡しの時はどのように行っているのでしょうか? もし良い解決策がありましたらご教授下さい。

    • ベストアンサー
    • PHP
  • POSTで配列のデータを渡す方法は?

    初歩的な質問で申し訳ございません。配列でデータを入力し、POSTで配列のデータを渡す方法を知らなくて困っています。いろいろ調べましたが、見つかりません。 だれか、教えてください。 ..... &ReadParse(*in); for ($i = 0 ; $i <=10 ; $i++){    $data[$i] = $in{'data[$i]'}; } sub main { 。。。以下修正部分・。。。 print "<form method=\"POST\" action=\"$userpro\">"; print " <input type=\"hidden\" name=\"mode\" value=\"miss1\"><p>"; print " <input type=\"text\" name=\"data[1]\" size=\"20\" value=\"$data[1] \">"; print " <input type=\"text\" name=\"data[2]\" size=\"20\" value=\"$data[2] \">"; print " <input type=\"text\" name=\"data[3]\" size=\"20\" value=\"$data[3] \">"; ...... print " <p><input type=\"submit\" value=\"修正\" name=\"B1\"></p>\n" ; print "</form>\n" ; ・・・・ } #Submit後実行される関数 sub miss1 { print "Content-type: text/html\n\n"; for ($i = 0 ; $i <=10 ; $i++){ print "$i-$data[$i]<br>"; } exit; } 結果は 0-空(空白) 1-空(空白) 2-空(空白) 。。。 にです。 何が間違っているでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • Access テーブルのフィールド名

    AccessでレジのPOSデータを管理しています。 txtデータをインポートして、月別で管理しています。 インポートの際、項目名がついていないため、 Accessでは「フィールド1」「フィールド2」と いった名前がついています。 分析のため、「品名」「分類」といった項目名に 変えるため【テーブル】→【デザイン】でフィールド名を 一つ一つ手作業で変えています。 毎月の事なので、一度に変更できる方法があったら ご指導いただきたく質問させていただきました。 「フィールド1」=「品名」 「フィールド2」=「分類」 といったように項目は毎月同じ場所に設定されます。 説明がつたないかもしれませんが、必要でしたら補足 致しますのでよろしくお願い致します。

  • データが多いとエラーになる:改行をbrタグに変換

    フォームから受け取ったデータに改行があれば<br />に変換。 さらに<br />が2つ続いたら</p><p>に変換。 それを、テキストエリアに表示したいのですが、次のようなコードを書いたところ、 入力するデータが少ない(100文字程度)時は、問題なく処理されますが、データが多い(200~300文字程度)とエラー(Premature end of script headers:hoge.cgi)になります。 どこがいけないのか教えて下さい。 PCのスペックの問題なのでしょうか。 送り側(htmlのフォーム)の該当箇所 <textarea name="reviw" id="reviw" rows="8" cols="46"></textarea> CGIは 冒頭で 受け取ったデータの改行コードは、\nに変換し $in{$key} = $val; の形でセットしてあります。 print "Content-type: text/html\n\n"; (中略) print <<'CK13'; <tr> <td> <textarea name="tagoutput" cols="70" rows="10" onclick="this.focus();this.select()"> CK13 print '<p>'; &reviw_put; print <<'CKouttag6'; </p> </textarea> </td></tr> CKouttag6 (後略) がhtml出力部分で、 サブルーチンは sub reviw_put { $in{'reviw'} =~ s/\x0A/<br \/>/g; $in{'reviw'} =~ s/(<br \/>){2}/<\/p><p>/g; print "$in{'reviw'}"; } です。

    • ベストアンサー
    • Perl
  • 4テーブル中、2テーブルが外部結合の場合のSQL

    ORACLE10gを使用しています。下記の●考えたSQLを作成しましたが、エラーにこそなりませんがレスポンスが返ってきません。 4つの参照テーブルのうち2テーブルが外部結合の場合の効率的な書き方のアドバイスをお願いします。 ●やりたいこと ・AとB(主テーブル)から該当データ抽出 ・Bの品番・得意先でCが存在すればCからコードを抽出し、Dが存在すればそのコードの名称をDから取得 ・すごく簡単に書くと下記みたいなイメージです。エラーになりますが。 SELECT A.*,B.*,C.CD1,D.CD1NM,C.CD2,D.CD2NM,・・・ FROM A,B,C,D WHERE A.KEY1 = B.KEY1 AND A.KEY2 = B.KEY2 AND B.TOK_CD = C.TOK_CD(+) AND B.HIN_CD = C.HIN_CD(+) AND C.CD1 = D.CD1(+)・・・ ●考えたSQL SELECT A.*,B.*,C.CD1,D.CD1NM,C.CD2,D.CD2NM,・・・ FROM A,B,C,D ( SELECT C.MAKER_CD, C.HIN_CD, C.CD1, C.CD2, C.CD3 FROM A,B,C WHERE A.KEY1 = 画面.指定 AND A.KEY2 = 画面.指定 AND B.MAKER_CD=C.MAKER_CD AND B.HIN_CD = C.HIN_CD )SUB_Q WHERE A.COL1 = 画面.指定 AND A.COL2 = 画面.指定 AND A.KEY1=B.KEY1 AND A.KEY2=B.KEY2 AND B.MAKER_CD = SUB_Q.MAKER_CD(+) AND B.HIN_CD = SUB_Q.HIN_CD(+) AND D.CD1(+) = SUB_Q.CD1 AND D.CD2(+) = SUB_Q.CD2 AND D.CD3(+) = SUB_Q.CD3 ○参考 Dテーブルは大分類・中分類のような分類コードとその名称を管理するテーブルでCD1のみ値が入っていればそのレコードは大分類レコードでNAMEの値は大分類名という使用方法です。実際のSQLではDテーブルに別名を付けて、D1.CD1=** AND D1.CD2 IS NULL AND D.CD3 IS NULL ・・・とひとつずつ記述しますがここでは簡略化しています。 <レイアウトイメージ> CD1|CD2|CD3|CD4|CD5|NAME ----------------------- A|NULL|NULL|NULL|NULL|電化製品 A|a|NULL|NULL|NULL|冷蔵庫

  • foreachでループした変数を他のサブルーチンに受け渡す方法を教えてください。

    ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、sub mainの中の$dataをsub htmlの中で表示させて、sub mainでループさせた値をすべてsub mailへわたしたいのです、hiddenタグで<input type=\"hidden\" name=\"all\" value=\"$all\">とやってもうまくいきませんでした。@inの中をループさせるので@inをそのままかけばいいのでしょうか?これもうまくいきませんでした。。ようはループさせた値をすべてメールで送信したいのです。どうしたらうまくできますでしょうか? sub main{ foreach(@in){ ($name1,$value1) = split(/=/,$_); $data="$name1 : $value1"; print "$data"; print "<br>"; } sub html{ print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> &main; <form action="" method=""> <input type=\"hidden\" name=\"all\" value=\"$all\"> <input type=\"submit\" value=\"送信する\"> </form> </body> </html> EOF } sub mail { ####省略しますが、ここはメールの送信の記述です。 }

    • ベストアンサー
    • Perl
  • PHPでJSONデータへのアクセスについて

    15年前にC言語を少し学び、以後はVBA等のスクリプト言語をたまにかじっている程度の初級者です。 PHPは今回初めて触ります。 AmazonのサジェストAPIでキーワードを取得しようと試みてみました。 http://completion.amazon.co.jp/search/complete?method=completion&search-alias=aps&mkt=6&q=キーワード このURLにキーワードを放り込むとJSONデータが帰ってきます。 例:キー [ "キー", [ "キーボード", "キーケース", "キーホルダー", "キーケース レディース", "キーケース メンズ", "キーリング", "キースへリング", "キーボード bluetooth", "キーボード 楽器", "キーカバー" ], [ { "nodes": [ { "alias": "computers", "name": "パソコン・周辺機器" }, { "alias": "electronics", "name": "家電&カメラ" }, { "alias": "mi", "name": "楽器" } ] }, {}, {}, {}, {}, {}, {}, {}, {}, {} ], [] ] ■■コード1 予測変換の取得 $text = "キー"; $url = 'http://completion.amazon.co.jp/search/complete?method=completion&search-alias='.$s_alias.'&mkt=6&q='.urlencode($text); $json = file_get_contents($url); $data = json_decode($json,true); foreach( $data[1] as $x){ $x = str_replace( $text , " " , $x); print $x; } このコード1で変換予測まではなんとかアクセス出来ました。 しかし、『nodes』の『name』と『alias』へアクセスするにはどういうコードを書けばアクセスできるか分からず詰まっています。 PHPもJSONも連想配列もよく分かって居ないため、 どの情報へアクセスすれば良いのかわからず数日右往左往してました。 詳しい方、『nodes』の『name』と『alias』へのアクセスの仕方をよろしければご教示下さいませ。

    • ベストアンサー
    • PHP
  • どのデータ型で宣言すればいいのでしょうか?

    VBAです。 http://okwave.jp/qa/q1318017.html を参考に、現在パソコンに入ってるプリンタ名の一覧を取得したいのですが ***************************************** Sub アクティブプリンターを取得する() Set Win = CreateObject("Shell.Application") For Each Obj_Item In Win.Namespace(4).Items Debug.Print Obj_Item.Name Next End Sub ***************************************** を実行すると、 「Win」と「Obj_Item」が 「変数が定義されていません。」というコンパイルエラーになってします。 なので、 ***************************************** Dim Win, Obj_Item As データ型 ***************************************** で、変数を宣言すればいいと思うのですが、どのデータ型で宣言すればいいのでしょうか? ご回答よろしくお願いします。

  • Microsoft Edgeのお気に入りデータ移行

    サブで使っていたノートPCが壊れてしまったため、HDDだけ取り出して別のPCに変換ケーブルで接続して中身のデータを取り出したのですが、Edgeに登録していたお気に入りの取り出し方がわからず困っています。 何か方法はありますでしょうか? 別の記事でお気に入りのデータは「C:\Users\ユーザーネーム\AppData\Local\Microsoft\Edge\User Data\Default\」のBookmarksというのはわかったのですが、これを単純にコピーしただけでは読み込めなくて。。。

専門家に質問してみよう