決定木やカーネルSVMを用いて予測モデルを作成したい
Pythonで倒産確率(ダミー変数で表現されています)を当てるモデルを作成しています.
その際にアンダーサンプリング等をしてデータを形成しているのですが欠損値が存在します.
実現したいこと
欠損値を削除して,データを作成したいです.
発生している問題・エラーメッセージ
AttributeError: 'numpy.ndarray' object has no attribute 'dropna'
問題以外のソースコード(正常に動いている)
python
1####################### 2# 必要なライブラリを読み込む 3####################### 4 5# データフレームが扱えるよう、pandas をインポート 6import pandas as pd 7 8# numpy のデータが扱えるよう、numpy をインポート 9import numpy as np 10 11# データ分割を行う便利なモジュール train_test_split をインポート 12from sklearn.model_selection import train_test_split 13 14# アンダーサンプリング用ライブラリをインポート 15from imblearn.under_sampling import RandomUnderSampler 16 17# データの標準化を行うためのモジュールをインポート 18from sklearn.preprocessing import StandardScaler 19 20# サポートベクターマシンを行うためのモジュールをインポート 21from sklearn.svm import SVC 22 23# ヒストグラムを描くためのモジュールをインポート 24import matplotlib.pyplot as plt 25import seaborn as sns 26 27# 正解率を作成するためのモジュールをインポート 28from sklearn.metrics import accuracy_score 29 30# 混合行列を作成するためのモジュールをインポート 31from sklearn.metrics import confusion_matrix 32 33# ROCを作成するためのモジュールをインポート 34from sklearn.metrics import roc_curve 35from sklearn.metrics import auc 36 37 38############## 39#データを読み込む 40############## 41df1 = pd.read_csv("/Usersi/Documents/ロールプレイモデル/データ/report.csv") 42 43 44 45######################### 46# 説明変数と目的変数に分離する 47######################### 48columnList = df1.columns.to_list() 49columnList.remove("KAISHA_CODE") 50columnList.remove("TOSAN_FLG") 51X = pd.DataFrame( df1.loc[:, columnList] ) 52y = pd.DataFrame( df1.loc[:, ["TOSAN_FLG"]] ) 53 54# データを訓練用データ・検証用データに分ける(訓練用:検証用=7:3) 55(X_train, X_test ,y_train, y_test) = train_test_split(X, y, test_size = 0.3) 56print(X_train.shape) 57print(y_train.shape) 58print(X_test.shape) 59print(y_test.shape) 60 61 62 63 64###################### 65# アンダーサンプリングを行う 66###################### 67# 正例の数を保存 68positive_count_train = int(y_train["TOSAN_FLG"].sum()) 69 70# 正例が20%になるまで負例をアンダーサンプリング 71#rus = RandomUnderSampler(ratio={0:positive_count_train*4, 1:positive_count_train}, random_state=1234) 72 73rus = RandomUnderSampler(random_state=1234) 74 75# 学習用データに反映 76X_train_rs, y_train_s = rus.fit_sample(X_train, y_train) 77X_train_rs = pd.DataFrame(X_train_rs, columns=columnList) 78y_train_rs = pd.DataFrame(y_train_s,columns=["TOSAN_FLG"]) 79print(rus) 80print(X_train_rs.shape) 81print(y_train_rs.shape) 82 83 84 85################################################# 86# 説明変数を標準化(平均0、標準偏差1となるように変数変換)する 87################################################# 88sclr_X = StandardScaler() 89sclr_X.fit(X_train_rs) 90X_train_rs_std = sclr_X.transform(X_train_rs) 91X_train_std = sclr_X.transform(X_train) 92X_test_std = sclr_X.transform(X_test)
問題のソースコード(上の続き)
python
1##################### 2 #欠損値を削除する 3##################### 4 5X_test = X_test.dropna(inplace = True) 6 7X_test_std = X_test_std.dropna(inplace = True) 8 9X_train = X_train.dropna(inplace = True) 10 11X_train_rs = X_train_rs.dropna(inplace = True) 12 13X_train_rs_std = X_train_rs_std.dropna(inplace = True) 14 15X_train_std = X_train_std.dropna(inplace = True) 16 17y_test = y_test.dropna(inplace = True) 18 19y_train = y_train.dropna(inplace = True) 20 21y_train_rs = y_train_rs.dropna(inplace = True) 22 23y_train_s = y_train_s .dropna(inplace = True) 24 25############################ 26# SVMを実施し、判別モデルを構築する 27############################ 28clf = SVC(C=10, kernel='linear', probability=True, random_state=1234) 29clf.fit(X_train_rs_std,y_train_rs) 30 31
試したこと
他の関数を使用して,削除を試みましたがうまくいきません.
python
1########### 2#欠損値を削除 3########### 4#X_train_rs_std = X_train_rs_std.dropna(inplace = True) 5#~np.isnan(X_test) 6X_test[~np.isnan(X_test)] 7 8#~np.isnan(X_test_std ) 9X_test_std[~np.isnan(X_test_std)] 10 11#~np.isnan(X_train) 12X_train[~np.isnan(X_train)] 13 14#~np.isnan(X_train_rs ) 15X_train_rs[~np.isnan(X_train_rs)] 16 17#~np.isnan(X_train_rs_std) 18X_train_rs_std[~np.isnan(X_train_rs_std)] 19 20#~np.isnan(X_train_std) 21X_train_std[~np.isnan(X_train_std)] 22 23#~np.isnan(X_train_rs_std) 24X_train_rs_std[~np.isnan(X_train_rs_std)] 25 26#~np.isnan(y_test ) 27y_test[~np.isnan(y_test)] 28 29#~np.isnan(y_train ) 30y_train[~np.isnan(y_train)] 31 32#~np.isnan(y_train_rs) 33y_train_rs[~np.isnan(y_train_rs)] 34 35#~np.isnan(y_train_s ) 36y_train_s[~np.isnan(y_train_s)] 37 38############################ 39# SVMを実施し、判別モデルを構築する 40############################ 41clf = SVC(C=10, kernel='linear', probability=True, random_state=1234) 42clf.fit(X_train_rs_std,y_train_rs) 43
表示されるエラーメッセージ
python
1nput contains NaN, infinity or a value too large for dtype('float64').
エラーメッセージの意味
エラーメッセージの意味など検索しましたが,pandasやnumpyなどの問題も絡んでそうです.
初心者なので,周辺知識もなく的外れなことをしている可能性もあります.
よろしくお願いいたします.
以下の記事が参考になるかもしれません。
ValueError: Input contains NaN, infinity or a value too large for dtype('float32') に対処する
https://qiita.com/maskot1977/items/33038175efdff7c6009b
回答1件
あなたの回答
tips
プレビュー