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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

1回答

1761閲覧

欠損値を削除できない(Python)

yuki.m.0525

総合スコア9

Python

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

0グッド

0クリップ

投稿2022/05/22 03:21

決定木やカーネル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などの問題も絡んでそうです.
初心者なので,周辺知識もなく的外れなことをしている可能性もあります.
よろしくお願いいたします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

起きていること

Python3

1X_test = X_test.dropna(inplace = True) 2# AttributeError: 'numpy.ndarray' object has no attribute 'dropna'

X_testという変数の実体は、Numpyのarray(例えば、(1,2,3,...))なので、dropnaを使えないよ、というエラーです。

DropNAする方法

pandasのデータフレームであればdropna()できます。
※dropnaの解説はここが詳しいです。

CSVの読み込みができている段階でデータフレームにできていますので、
データフレームをリストにする前にデータフレームに対してdropna()でうまくいくと思います。

具体的には、

Python3

1############## 2#データを読み込む 3############## 4df1 = pd.read_csv("/Usersi/Documents/ロールプレイモデル/データ/report.csv") 5 6# <<<ここから追加分>>> 7# axis=0の時は行を丸っと削除、列で消したいときはaxis=1 8df1 = df.dropna(how='all',axis=0) 9# <<<ここまで追加分>>> 10 11 12######################### 13# 説明変数と目的変数に分離する 14######################### 15columnList = df1.columns.to_list() 16columnList.remove("KAISHA_CODE") 17columnList.remove("TOSAN_FLG") 18X = pd.DataFrame( df1.loc[:, columnList] ) 19y = pd.DataFrame( df1.loc[:, ["TOSAN_FLG"]] ) 20

投稿2022/05/22 05:56

編集2022/05/22 05:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki.m.0525

2022/05/22 08:56

ありがとうございます. 無事,欠損値を除くことができました. ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問