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

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

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

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

機械学習

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

Python

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

Q&A

解決済

1回答

1523閲覧

sklearnのpredictにカテゴリ変数を渡したい

hima-mura.

総合スコア42

scikit-learn

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/11/04 13:00

編集2021/11/05 02:38

sample.py

1import pandas as pd 2import os 3import mglearn 4import sys 5adult_path=os.path.join(mglearn.datasets.DATA_PATH,'adult.data') 6# 対象者の収入が50000$以上かを予測するモデルを構築 7names=['age','workclass','fnlwgt','education','education-num', 8 'marital-status','occupation','relationship','race','gender', 9 'capital-gain','capital-loss','hours-per-week','native-country', 10 'income'] 11data=pd.read_csv( 12 adult_path,header=None,index_col=False, 13 names=names 14) 15# いくつかのコラムのみ抜き出す 16selected_names=['age','workclass','education','gender','hours-per-week','occupation','income'] 17data=data[selected_names] 18data_dummies=pd.get_dummies(data) # ダミー変数の作成 19 20# print(f'Original Feature:\n{list(data.columns)}','\n') 21# print(f'Dummied Feature:\n{list(data_dummies.columns)}','\n') 22''' 23Original Feature: 24['age', 'workclass', 'education', 'gender', 'hours-per-week', 'occupation', 'income'] 25Dummied Feature: 26['age', 'hours-per-week', 'workclass_ ?', 'workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Never-worked', 27'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 28'education_ 10th', 'education_ 11th', 'education_ 12th', 'education_ 1st-4th', 'education_ 5th-6th', 'education_ 7th-8th', 'education_ 9th', 29'education_ Assoc-acdm', 'education_ Assoc-voc', 'education_ Bachelors', 'education_ Doctorate', 'education_ HS-grad', 'education_ Masters', 30'education_ Preschool', 'education_ Prof-school', 'education_ Some-college', 'gender_ Female', 'gender_ Male', 'occupation_ ?', 31'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 32'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 33'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 34'occupation_ Transport-moving', 'income_ <=50K', 'income_ >50K'] len=46 35''' 36 37features=data_dummies.loc[:,'age':'occupation_ Transport-moving'] 38X=features.values 39y=data_dummies['income_ >50K'].values # valuesをつけるとリストに格納される 40# print(data_dummies['income_ >50K']) # 0がFalse、1がTrue 41print(f'X_shape:{X.shape},y_shape:{y.shape}') # X_shape:(32561, 44),y_shape:(32561,) 42from sklearn.linear_model import LogisticRegression # 通常最小二乗法 2クラス分類 43from sklearn.model_selection import train_test_split 44X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0) 45logreg=LogisticRegression() 46logreg.fit(X_train,y_train) 47print(f'Test score:{logreg.score(X_test,y_test)}') # 0.807 48 49# テストデータの特徴量から求めてる結果(その人の収入が50000$以上か)を表示する 50pred_text=[s for s in data.income.unique()] 51for i in (range(10)): 52 prediction=logreg.predict(X_test)[i] 53 print(f'Some prediction:{pred_text[prediction]}') 54''' 55Some prediction: <=50K 56Some prediction: <=50K 57Some prediction: <=50K 58Some prediction: <=50K 59Some prediction: <=50K 60Some prediction: >50K 61Some prediction: <=50K 62Some prediction: <=50K 63Some prediction: >50K 64Some prediction: <=50K 65''' 66 67# ここからが本当にやりたいことで、問題が生じているところ 68# モデルを構築した後に新たなデータのみを意味合いを保ったままダミーに変換して特徴量を得たい 69prediction=logreg.predict([39,'State-gov','Bachelors','Male',40,'Adm-clerical']) 70# 特徴量に変換していないのでErrorを吐いてしまう。 71print(f'Some prediction:{pred_text[prediction]}') 72''' 73例えば、[39,'State-gov','Bachelors','Male',40,'Adm-clerical']のSampleデータのみ 74をモデルに与えて予測をしたのちに上記のように「Some prediction: <=50K」を結果を表示したい。 75このときにpredict関数に渡すためにまずSampleデータを特徴量のデータに変換する必要が 76あり、ダミー変数を使うだろうが、Sampleデータ単体だけで変換したものと、すでに変換した 77data_dummiesでは意味がことなってくるので、このSampleデータのみでは 78get_dummies関数で正しく変換できないと思われる。すでにダミー変数の手本(今回はすでに変換したdata_dummies) 79みたいなものがあるのでこれを用いてSampleデータを変換したいがやり方がわからない。 80''' 81

現在、O'REILLYの「Pythonで始める機械学習」でモデルの勉強をしています。ここでは与えられたデータからそれに対応する人の収入が50000$以上かを2クラス分類で予測するモデルを構築しました。
ですが、実際に使うとき、ある人、一人のデータがあり、それをモデルに渡し、その人の予想結果だけを知りたいとなったときに、その渡す少ないデータを、構築済みのモデルに適した形の特徴量に変換する方法がわかりません。ネットなどでできる限り調べたのですが、scoreでR^2値を出して終わっているモデル例ばかりで参考になるものを見つけきれませんでした。
助言をお願いします。

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

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

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

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

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

meg_

2021/11/04 13:41

> ですが、実際に使うとき、ある人、一人のデータがあり、それをモデルに渡し、その人の予想結果だけを知りたいとなったときに、その渡す少ないデータを、構築済みのモデルに適した形の特徴量に変換する方法がわかりません。 訓練データ作成と同様の処理をすれば良いのではないですか?
hima-mura.

2021/11/05 02:32

新たなデータを追加したデータセットを用意してそれをダミー化するので二度手間感がぬぐえないですが、同様の処理をしたら予測できました。訓練データ作成と同様の処理を新たなデータに適用するメソッドがすでにあることを期待していたのですが、自分で調べた感じではないっぽいですね。おとなしく関数つくります。 ありがとうございます。
guest

回答1

0

自己解決

新たなデータを追加したデータセットを用意してそれをダミー化するので二度手間感がぬぐえないですが、同様の処理をしたら予測できました。

投稿2021/11/05 02:35

hima-mura.

総合スコア42

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

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

hima-mura.

2021/11/05 08:35

とても参考になりました。get_dummies()より圧倒的に使い勝手がいいですね。ohe使って書き直してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問