🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1349閲覧

[pandas,二値分類]ダミー変数を含むデータを読み込ませ,解析までを行いたいです.

Fnaniel

総合スコア5

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/12/24 07:02

編集2019/12/26 04:10

前提・実現したいこと

イメージ説明

Pythonの『pandas』を用いてデータの二値分類(2クラス分類,二項分類)を行いたいと考えています.画像のデータ(Excel)を扱っていて,「AF」を説明関数X,「Name」を目的関数Yとして分類を行っています.「AF」の説明変数がすべて数値のデータである場合については,割と簡単に分類することができましたが,画像のように説明変数が数値データとダミー変数の混在しているデータである場合,どのように解析にもっていけばいいのかわかりません.「C~F」はカテゴリ変数をダミー変数(One-Hot表現)にしてデータを作成しました.
このデータに対し,「Pandas」を用いて二値分類(決定木,SVM,線形判別分析などなんらか)を行いたいのですが,データの読み込ませ方が分かりません.
よろしくお願いします.

http://www.tsjshg.info/udemy/Lec76-79.html

上記サイトに似たような条件のロジスティック回帰の例が記載されていますが,このような方法が妥当なのでしょうか...

A B C D E F Name
50000 120 0,0,1,0,0 0,0,1 0,1,0,0 0,0,0,1 1
35000 80 0,0,1,0,0 0,0,1 0,1,0,0 0,1,0,0 0
20000 50 1,0,0,0,0 0,1,0 0,0,1,0 0,0,0,1 1
42000 65 0,0,0,0,1 0,0,1 1,0,0,0 0,0,0,1 1
51000 110 0,0,0,1,0 1,0,0 0,1,0,0 0,0,0,1 0
23000 55 1,0,0,0,0 1,0,0 0,0,0,1 1,0,0,0 1
38000 85 0,0,0,1,0 1,0,0 0,0,0,1 0,0,0,1 0
46000 95 1,0,0,0,0 0,1,0 0,0,1,0 0,1,0,0 0
4000 90 1,0,0,0,0 0,0,1 1,0,0,0 0,0,0,1 1
19000 45 0,0,0,1,0 0,0,1 0,0,1,0 0,0,0,1 0

これをコピーしてExcelの「A1~G11」にテキスト形式で張り付けたものと実データは全く一緒です.

このデータは10行のテストデータですが,
最終的には2000行あるデータで二値分類を行いたいと考えています.

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last)
<ipython-input-11-bdb8fb2b37d7> in <module>
1 from sklearn.tree import DecisionTreeClassifier
2 model = DecisionTreeClassifier(max_depth=3, random_state=0)
----> 3 model.fit(X, Y)
4 model.predict(X)

~\Anaconda3\lib\site-packages\sklearn\tree\tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
799 sample_weight=sample_weight,
800 check_input=check_input,
--> 801 X_idx_sorted=X_idx_sorted)
802 return self
803

~\Anaconda3\lib\site-packages\sklearn\tree\tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
114 random_state = check_random_state(self.random_state)
115 if check_input:
--> 116 X = check_array(X, dtype=DTYPE, accept_sparse="csc")
117 y = check_array(y, ensure_2d=False, dtype=None)
118 if issparse(X):

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
525 try:
526 warnings.simplefilter('error', ComplexWarning)
--> 527 array = np.asarray(array, dtype=dtype, order=order)
528 except ComplexWarning:
529 raise ValueError("Complex data not supported\n"

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
536
537 """
--> 538 return array(a, dtype, copy=False, order=order)
539
540

ValueError: could not convert string to float: '0,0,1,0,0'

該当のソースコード

Python

1import pandas as pd 2 3df = pd.read_excel(r'C:\Users\AAA.xlsx') #エクセルファイルの読み込み 4df #エクセルファイルの表示 5 6df['Name'].value_counts() #「Name」列の「1」,「0」の各個数表示 7 8X = df.drop('Name', axis=1) #「Name」列以外の列を説明変数Xに設定 9Y = df['Name']    #「Name」列を目的変数Yに設定 10X.head() 11 12from sklearn.tree import DecisionTreeClassifier #機械学習ライブラリscikit-learnの中からDecisionTreeClassifier(決定木)を呼び出す 13model = DecisionTreeClassifier(max_depth=3, random_state=0) #modelという名前で決定木を使う宣言(モデルの条件として、max_depth、random_state) 14model.fit(X, Y) #教師データを先ほど宣言したモデルに代入して学習を実行し、機械学習モデルの作成 15model.predict(X) 16

from sklern~ 以下よりエラーが生じます.

試したこと

https://news.mynavi.jp/article/Python_ML-5/
上記のサイトに沿って動かしてみただけです.
説明変数が数値じゃないのでエラーが出たんだと思います.

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hayataka2049

2019/12/24 15:03 編集

pandasだけでは分類は行なえません。統計や機械学習などのライブラリ・手法の実装が別途必要になりますが、どういった方法を想定していますか? また、各列のデータ型を教えて下さい。可能であれば極力、データを再現できるDataFrameの式か、csvファイルと読み込みのコードを追記してください。
Fnaniel

2019/12/25 02:23

ご返信ありがとうございます. 該当のソースコードの箇所にExcelデータの読み込み,説明変数,目的変数の設定までのプログラムを明記しました.よろしくお願いします. https://news.mynavi.jp/article/Python_ML-5/ 上記のサイトのような流れで行えないかと考えていました. また,下記サイトのライブラリ群を用いて,他の手法も試したいと考えていました. https://qiita.com/maskot1977/items/b2cfb369f60ad02887b0
hayataka2049

2019/12/25 02:45

コードは<code>ボタンのコードブロックを使って記述してください。また、コードだけあってもファイルがなければ動かしようがありません。スクショから手打ちするのはとんでもない手間ですし、データ型等が一致する保証はありません。.xlsmファイルをどこかにアップしてリンクするか、csv形式などのテキストフォーマットに変換してテキストとして貼り付けてください(その場合は同じDataFrameが再現できるように読み込みのコードも変更してください)。
Fnaniel

2019/12/26 04:14

「前提・実現したいこと」欄にデータを記載しました.その数値をコピーしてもらいエクセルファイル(ファイル名:AAA.xlsx)のA1~G11に張り付けてもらえば完全に同じエクセルファイルが出来上がります.実データもすべて手打ちで作成しました. また何かご不明点がありましたら,よろしくお願いします.
guest

回答1

0

ベストアンサー

どうやらカンマ区切りの文字列を要素として持つようですから、

  • 分割する
  • 数値型に変換する

という処理が必要になります。実際はSeriesからDataFrameへの型変換なども絡んで、なかなか厄介です。

とりあえずscikit-learnで扱えるようにtransformerを組んでみました。

python

1import io 2import numpy as np 3import pandas as pd 4from sklearn.preprocessing import FunctionTransformer 5from sklearn.compose import ColumnTransformer 6 7def process_a_column(s): 8 sp = s.str.split(",").map(lambda l: list(map(float, l))) 9 df = pd.DataFrame.from_items(zip(sp.index, sp.values)).T 10 return df.values 11 12def process_df(df): 13 return np.hstack([process_a_column(df[k]) for k in df]) 14 15data = """ 16A B C D E F Name 1750000 120 0,0,1,0,0 0,0,1 0,1,0,0 0,0,0,1 1 1835000 80 0,0,1,0,0 0,0,1 0,1,0,0 0,1,0,0 0 1920000 50 1,0,0,0,0 0,1,0 0,0,1,0 0,0,0,1 1 2042000 65 0,0,0,0,1 0,0,1 1,0,0,0 0,0,0,1 1 2151000 110 0,0,0,1,0 1,0,0 0,1,0,0 0,0,0,1 0 2223000 55 1,0,0,0,0 1,0,0 0,0,0,1 1,0,0,0 1 2338000 85 0,0,0,1,0 1,0,0 0,0,0,1 0,0,0,1 0 2446000 95 1,0,0,0,0 0,1,0 0,0,1,0 0,1,0,0 0 254000 90 1,0,0,0,0 0,0,1 1,0,0,0 0,0,0,1 1 2619000 45 0,0,0,1,0 0,0,1 0,0,1,0 0,0,0,1 0 27""" 28 29df = pd.read_csv(io.StringIO(data), sep="\s+", engine="python") 30X = df.drop('Name', axis=1) 31Y = df['Name'] 32 33ft = FunctionTransformer(process_df) 34ct = ColumnTransformer([("numerics", "passthrough", ["A", "B"]), 35 ("str_cols", ft, ["C", "D", "E", "F"])], 36 remainder="passthrough", 37 sparse_threshold=0) 38 39result = ct.fit_transform(X) 40print(repr(result)) 41""" => 42array([[5.0e+04, 1.2e+02, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 43 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 44 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00], 45 [3.5e+04, 8.0e+01, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 46 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 47 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00], 48 [2.0e+04, 5.0e+01, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 49 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 50 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00], 51 [4.2e+04, 6.5e+01, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 52 0.0e+00, 0.0e+00, 1.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 53 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00], 54 [5.1e+04, 1.1e+02, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 55 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 56 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00], 57 [2.3e+04, 5.5e+01, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 58 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 59 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00], 60 [3.8e+04, 8.5e+01, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 61 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 62 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00], 63 [4.6e+04, 9.5e+01, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 64 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 65 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00], 66 [4.0e+03, 9.0e+01, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 67 0.0e+00, 0.0e+00, 1.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 0.0e+00, 68 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00], 69 [1.9e+04, 4.5e+01, 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 70 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 0.0e+00, 1.0e+00, 0.0e+00, 71 0.0e+00, 0.0e+00, 0.0e+00, 1.0e+00]]) 72"""

あくまでも参考例なので、このコードはこのまま使わないでください(細かい問題が色々あると思います)。これを参考に設計していただき、あとは任意のestimatorとPipelineを組むと良いかと思います。


ただしこれは扱いづらいですから(たとえば変数名などは改めて自分で用意する他ありません)、エクセル上では名義尺度(カテゴリのラベル)のまま持たせておいて、Python側でscikit-learnのOheHotEncoderを用いたほうが無理がないかもしれません。OneHotEncoderなどを使えばPython側でもよしなに取り扱ってくれますので。

参考
python - Convert pandas series of lists to dataframe - Stack Overflow
sklearn.preprocessing.FunctionTransformer — scikit-learn 0.22 documentation
sklearn.compose.ColumnTransformer — scikit-learn 0.22 documentation

投稿2019/12/26 17:20

hayataka2049

総合スコア30935

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

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

Fnaniel

2020/01/06 05:11

返信が遅くなり申し訳ありません. 本当にありがとうございました. 参考にさせていただきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問