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値を出して終わっているモデル例ばかりで参考になるものを見つけきれませんでした。
助言をお願いします。
回答1件
あなたの回答
tips
プレビュー