決定木やカーネルSVMを用いて予測モデルを作成したい
Pythonで倒産確率(ダミー変数で表現されています)を当てるモデルを作成しています.
その際にアンダーサンプリング等をしてデータを形成しているのですが欠損値が存在します.
実現したいこと
欠損値を削除して,データを作成したいです.
発生している問題・エラーメッセージ
AttributeError: 'numpy.ndarray' object has no attribute 'dropna'
問題以外のソースコード(正常に動いている)
python
####################### # 必要なライブラリを読み込む ####################### # データフレームが扱えるよう、pandas をインポート import pandas as pd # numpy のデータが扱えるよう、numpy をインポート import numpy as np # データ分割を行う便利なモジュール train_test_split をインポート from sklearn.model_selection import train_test_split # アンダーサンプリング用ライブラリをインポート from imblearn.under_sampling import RandomUnderSampler # データの標準化を行うためのモジュールをインポート from sklearn.preprocessing import StandardScaler # サポートベクターマシンを行うためのモジュールをインポート from sklearn.svm import SVC # ヒストグラムを描くためのモジュールをインポート import matplotlib.pyplot as plt import seaborn as sns # 正解率を作成するためのモジュールをインポート from sklearn.metrics import accuracy_score # 混合行列を作成するためのモジュールをインポート from sklearn.metrics import confusion_matrix # ROCを作成するためのモジュールをインポート from sklearn.metrics import roc_curve from sklearn.metrics import auc ############## #データを読み込む ############## df1 = pd.read_csv("/Usersi/Documents/ロールプレイモデル/データ/report.csv") ######################### # 説明変数と目的変数に分離する ######################### columnList = df1.columns.to_list() columnList.remove("KAISHA_CODE") columnList.remove("TOSAN_FLG") X = pd.DataFrame( df1.loc[:, columnList] ) y = pd.DataFrame( df1.loc[:, ["TOSAN_FLG"]] ) # データを訓練用データ・検証用データに分ける(訓練用:検証用=7:3) (X_train, X_test ,y_train, y_test) = train_test_split(X, y, test_size = 0.3) print(X_train.shape) print(y_train.shape) print(X_test.shape) print(y_test.shape) ###################### # アンダーサンプリングを行う ###################### # 正例の数を保存 positive_count_train = int(y_train["TOSAN_FLG"].sum()) # 正例が20%になるまで負例をアンダーサンプリング #rus = RandomUnderSampler(ratio={0:positive_count_train*4, 1:positive_count_train}, random_state=1234) rus = RandomUnderSampler(random_state=1234) # 学習用データに反映 X_train_rs, y_train_s = rus.fit_sample(X_train, y_train) X_train_rs = pd.DataFrame(X_train_rs, columns=columnList) y_train_rs = pd.DataFrame(y_train_s,columns=["TOSAN_FLG"]) print(rus) print(X_train_rs.shape) print(y_train_rs.shape) ################################################# # 説明変数を標準化(平均0、標準偏差1となるように変数変換)する ################################################# sclr_X = StandardScaler() sclr_X.fit(X_train_rs) X_train_rs_std = sclr_X.transform(X_train_rs) X_train_std = sclr_X.transform(X_train) X_test_std = sclr_X.transform(X_test)
問題のソースコード(上の続き)
python
##################### #欠損値を削除する ##################### X_test = X_test.dropna(inplace = True) X_test_std = X_test_std.dropna(inplace = True) X_train = X_train.dropna(inplace = True) X_train_rs = X_train_rs.dropna(inplace = True) X_train_rs_std = X_train_rs_std.dropna(inplace = True) X_train_std = X_train_std.dropna(inplace = True) y_test = y_test.dropna(inplace = True) y_train = y_train.dropna(inplace = True) y_train_rs = y_train_rs.dropna(inplace = True) y_train_s = y_train_s .dropna(inplace = True) ############################ # SVMを実施し、判別モデルを構築する ############################ clf = SVC(C=10, kernel='linear', probability=True, random_state=1234) clf.fit(X_train_rs_std,y_train_rs)
試したこと
他の関数を使用して,削除を試みましたがうまくいきません.
python
########### #欠損値を削除 ########### #X_train_rs_std = X_train_rs_std.dropna(inplace = True) #~np.isnan(X_test) X_test[~np.isnan(X_test)] #~np.isnan(X_test_std ) X_test_std[~np.isnan(X_test_std)] #~np.isnan(X_train) X_train[~np.isnan(X_train)] #~np.isnan(X_train_rs ) X_train_rs[~np.isnan(X_train_rs)] #~np.isnan(X_train_rs_std) X_train_rs_std[~np.isnan(X_train_rs_std)] #~np.isnan(X_train_std) X_train_std[~np.isnan(X_train_std)] #~np.isnan(X_train_rs_std) X_train_rs_std[~np.isnan(X_train_rs_std)] #~np.isnan(y_test ) y_test[~np.isnan(y_test)] #~np.isnan(y_train ) y_train[~np.isnan(y_train)] #~np.isnan(y_train_rs) y_train_rs[~np.isnan(y_train_rs)] #~np.isnan(y_train_s ) y_train_s[~np.isnan(y_train_s)] ############################ # SVMを実施し、判別モデルを構築する ############################ clf = SVC(C=10, kernel='linear', probability=True, random_state=1234) clf.fit(X_train_rs_std,y_train_rs)
表示されるエラーメッセージ
python
nput 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
まだ回答がついていません
会員登録して回答してみよう