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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

機械学習

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

Q&A

解決済

3回答

3316閲覧

one-hot エンコーディングを実行したいのに、value errorになる

KazuhideSakai

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

機械学習

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

0グッド

0クリップ

投稿2019/06/28 10:41

編集2019/06/28 12:49

前提・実現したいこと

データの前処理の勉強をテキストにそってやっています。
one-hot エンコーディングを実行しようとしたのですが、以下のエラーメッセージが発生しました。

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

ValueError: could not convert string to float: 'M'

該当のソースコード

from sklearn.preprocessing import OneHotEncoder from sklearn.preprocessing import LabelEncoder import numpy as np import pandas as pd df = pd.DataFrame([ ['green', 'M', 10.1, 'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']]) df.columns = ['color', 'size', 'price', 'classlabel'] X = df[['color', 'size', 'price']].values color_le = LabelEncoder() X[:, 0] = color_le.fit_transform(X[:, 0]) ohe = OneHotEncoder(categorical_features=[0]) ohe.fit_transform(X).toarray()

得られる結果

array([[ 0. , 1. , 0. , 1. , 10.1], [ 0. , 0. , 1. , 2. , 13.5], [ 1. , 0. , 0. , 3. , 15.3]])

試したこと

warning で

DeprecationWarning: The 'categorical_features' keyword is deprecated in version 0.20 and will be removed in 0.22. You can use the ColumnTransformer instead.

とでていたので、columntransformerを試してみましたが、だめでした。

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

python3.7、Anaconda

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

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

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

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

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

hayataka2049

2019/06/28 11:45

テキストではそれを実行するとどんな結果が得られると説明していましたか?
KazuhideSakai

2019/06/28 12:52

お返事、ありがとうございます。 上記内容を変更いたしました。 color 値を整数化し、ダミー特徴量が作成された配列が得られるとあります。
hayataka2049

2019/06/28 13:17

X[:, 0] = color_le.fit_transform(X[:, 0]) は正しいでしょうか? とりあえず、 X[:, 1] = color_le.fit_transform(X[:, 1]) としないと質問のような結果にはならないような(それでもエラー出ますけど)
guest

回答3

0

正直なところいろいろ理解できていませんが(そのコードでその結果は出ない気がする。あと、ドキュメントを見る限りは動きそうなcategorical_featuresの指定が動かなかったりする)、とりあえず近い結果が得られるコードが以下になります。

python

1from sklearn.preprocessing import OneHotEncoder 2from sklearn.preprocessing import LabelEncoder 3from sklearn.compose import ColumnTransformer 4import pandas as pd 5df = pd.DataFrame([ 6 ['green', 'M', 10.1, 'class1'], 7 ['red', 'L', 13.5, 'class2'], 8 ['blue', 'XL', 15.3, 'class1']]) 9df.columns = ['color', 'size', 'price', 'classlabel'] 10X = df[['color', 'size', 'price']].values 11color_le = LabelEncoder() 12X[:, 1] = color_le.fit_transform(X[:, 1]) 13ohe = OneHotEncoder() 14ct = ColumnTransformer([("categorical", ohe, [0]), 15 ("numeric", "passthrough", [1,2])]) 16 17result = ct.fit_transform(X) 18print(result) 19""" => 20[[0.0 1.0 0.0 1 10.1] 21 [0.0 0.0 1.0 0 13.5] 22 [1.0 0.0 0.0 2 15.3]] 23"""

投稿2019/06/28 13:38

hayataka2049

総合スコア30933

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

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

KazuhideSakai

2019/06/28 13:46

ありがとうございます。 自分がやった方法よりもスマートです。 warning もでないですし。 勉強します。
hayataka2049

2019/06/28 13:49

スマートさも大切だけど、まずは本に書いてある順番通りにちゃんと動かすところから
guest

0

自己解決

エラーの出た項以前にあった、各特徴量の整数変換を追加することで解決。

# Tシャツのサイズと整数を対応させるディクショナリを生成 size_mapping = {'XL': 3, 'L': 2, 'M': 1} # Tシャツのサイズを整数に変換 df['size'] = df['size'].map(size_mapping) # クラスラベルと整数を対応させるディクショナリを生成 class_mapping = {label:idx for idx, label in enumerate(np.unique(df['classlabel']))} # クラスラベルを整数に変換 df['classlabel'] = df['classlabel'].map(class_mapping) # ラベルエンコーダのインスタンスを生成 class_le = LabelEncoder() # クラスラベルから整数に変換 y = class_le.fit_transform(df['classlabel'].values)

上記によって、テキスト通りの結果が得られた。

しかし、
FutureWarning と DeprecationWarning が出たが、ここでは問題ではないため、許容する。

投稿2019/06/28 13:38

KazuhideSakai

総合スコア12

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

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

Orlofsky

2019/06/28 13:53

次の質問から現象を再現できる最小限のコードを提示してください。
KazuhideSakai

2019/06/28 13:56

最小限というのは、 コメントなし、まとめられるコードをまとめ、 コードの順序は整理するということでしょうか。
hayataka2049

2019/06/28 14:03 編集

今回は現象は再現できましたし、問題はそこではなかったです。最小限だからといってコメントまで外す必要はありません(けど、わかりやすいような整理は全体的にしていただいた方が回答する側としては助かります。)
KazuhideSakai

2019/06/28 14:04

承知いたしました。 丁寧な対応、ご助言、誠に感謝いたします。 次回から改善してまいります。
guest

0

どこで出ているエラーか解りませんが、

ValueError: could not convert string to float: 'M'

文字列から浮動小数点型に変換できない、
って怒られています。
読み込むデータから個々にきちんと追跡しては?

投稿2019/06/28 13:01

Orlofsky

総合スコア16415

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

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

KazuhideSakai

2019/06/28 13:03

データは読み込んだものではなく 作成したものなのですが、 その場合はどうすればよいのでしょうか。
Orlofsky

2019/06/28 13:15

作成した場合でも、'M' が文字列から浮動小数点型に変換できないのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問