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

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

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

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

Q&A

解決済

1回答

4994閲覧

pythonでK近傍法を実行する際に、データを標準化すると、エラーとなり苦慮しております。

akakage13

総合スコア89

Python

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

0グッド

0クリップ

投稿2017/06/24 03:48

pythonでK近傍法を実行する際に、データを標準化すると、エラーとなり苦慮しております。

競馬関連情報を用いて、K近傍法の勉強をさせていただいています。

# -*- coding: utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import LeaveOneOut from sklearn.metrics import accuracy_score from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler ############## #訓練データ jockey = pd.read_csv("jockey_2.csv" , sep=",") # 標準化 sc = StandardScaler() jockeystd = sc.fit_transform(jockey) print jockeystd ############### # 特徴データとラベルデータを取り出す jockey_except_arrival = jockey.drop("arrival", axis=1) features = jockey_except_arrival.as_matrix() targets = jockey['arrival'].as_matrix() predicted_labels = [] loo = LeaveOneOut() for train, test in loo.split(features): train_data = features[train] target_data = targets[train] model = KNeighborsClassifier(n_neighbors=1) model.fit(train_data, target_data) predicted_label = model.predict(features[test]) predicted_labels.append(predicted_label) score = accuracy_score(targets, predicted_labels) print(score) model = KNeighborsClassifier(n_neighbors=1) model.fit(features, targets) arrival, = model.predict([[3,8,2]]) print(arrival)

jockey_2.csvの内容は、以下のとおりでございます。

weather race_num course arrival 2 11 2 1 2 12 2 1 4 10 1 0 4 8 1 0 4 6 2 1 4 5 1 0 4 4 1 0

上記のソースコードを実行しますと、以下のような結果になります。

[[-1.58113883 1.0422125 1.15470054 1.15470054]
[-1.58113883 1.38961667 1.15470054 1.15470054]
[ 0.63245553 0.69480833 -0.8660254 -0.8660254 ]
[ 0.63245553 0. -0.8660254 -0.8660254 ]
[ 0.63245553 -0.69480833 1.15470054 1.15470054]
[ 0.63245553 -1.0422125 -0.8660254 -0.8660254 ]
[ 0.63245553 -1.38961667 -0.8660254 -0.8660254 ]]
0.857142857143
0

データを標準化しておりませんので、うまく動きます。

さて、
ここから、ステップアップしまして、上記にございます、標準化された値を用いて、ソースコードを動かしたいのですが、うまく出来ません。

下記が、標準化するために上記のソースコードから改変した箇所でございます。

# 特徴データとラベルデータを取り出す jockey_except_arrival = jockeystd.drop("arrival", axis=1) features = jockey_except_arrival.as_matrix() targets = jockeystd['arrival'].as_matrix()

このソースコードを実行しますと、以下のような、標準化された値と併せて、エラーコードが現れます。

[[-1.58113883 1.0422125 1.15470054 1.15470054] [-1.58113883 1.38961667 1.15470054 1.15470054] [ 0.63245553 0.69480833 -0.8660254 -0.8660254 ] [ 0.63245553 0. -0.8660254 -0.8660254 ] [ 0.63245553 -0.69480833 1.15470054 1.15470054] [ 0.63245553 -1.0422125 -0.8660254 -0.8660254 ] [ 0.63245553 -1.38961667 -0.8660254 -0.8660254 ]] Traceback (most recent call last): File "C:\Users\satoru\satoru_system_2.7\jockey_record\jockey_test\teisyutu_k-test-hatten.py", line 27, in <module> jockey_except_arrival = jockeystd.drop("arrival", axis=1) AttributeError: 'numpy.ndarray' object has no attribute 'drop'

標準化された値の右端が、目的変数になっておりますが、1.15470054が 1、-0.8660254 が 0と1と0ではなくなっております。

いろいろ試しましたが、うまく出来ませんでした。

標準化された数値を用いて、K近傍法を動かせるソースコードのご教示をよろしくお願いいたします。

併せまして、テストデータを、一回ずつではなく、

例えば、下記のようなCSVファイルを用いて、一回の入力で、複数のテストデータを入力可能な方法も御教示いただけますと幸いでございます。

weather race_num course arrival 2 6 2 2 12 7 4 5 1 4 7 5 4 6 2 7 7 2 4 4 1

当たり前ではございますが、一番右端の目的変数を空欄にしております。こちらもいろいろ試しましたが、うまく出来ませんでした。

大きく、2つの質問事項でございます。

先輩方の御教示、よろしくお願いいたします。

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

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

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

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

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

_Victorique__

2017/06/24 05:36

エラーの内容は理解していますか?理解しているのならそのデータをたどってデバッグすればどこがおかしいのか分かるはずです。まずはそこを明らかにしてください。
akakage13

2017/06/24 07:04

_Victorique__様、御指摘ありがとうございます。AttributeError: 'numpy.ndarray' object has no attribute 'drop'とは、numpyにはdrop属性はありませんというエラーだと思います。dropと同じような性質のモノに del もございますが、ValueError: cannot delete array elements とのように要素は削除不能と返事が返ってまいります。drop の代替えのソースコードが分からない状態でございます。
akakage13

2017/06/24 07:31

そもそも、データを削除しなくても良いように、最初から、データを分割して動かしたところ、ValueError: Unknown label type: 'continuous'連続値は認めないとのエラーが出てまいりました。
akakage13

2017/06/24 07:32

# -*- coding: utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import LeaveOneOut from sklearn.metrics import accuracy_score from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler ############## #訓練データ(目的変数削除済み) jockey = pd.read_csv("jockey_3.csv" , sep=",") # 標準化 sc = StandardScaler() jockeystd = sc.fit_transform(jockey) #訓練データ(目的変数のみ) jockey_a = pd.read_csv("jockey_3_a.csv" , sep=",") # 標準化 sc = StandardScaler() jockey_astd = sc.fit_transform(jockey_a) print jockeystd print jockey_astd ############### # 特徴データとラベルデータを取り出す (過去)jockey_except_arrival = jockeystd.drop("arrival", axis=1) features = jockeystd.as_matrix() targets = jockey_astd.as_matrix() predicted_labels = [] loo = LeaveOneOut() for train, test in loo.split(features): train_data = features[train] target_data = targets[train] model = KNeighborsClassifier(n_neighbors=1) model.fit(train_data, target_data) predicted_label = model.predict(features[test]) predicted_labels.append(predicted_label) score = accuracy_score(targets, predicted_labels) print(score) model = KNeighborsClassifier(n_neighbors=1) model.fit(features, targets)
akakage13

2017/06/24 07:34

見ずらくて申し訳ございません。ValueError: Unknown label type: 'continuous'を吐き出したソースコードでございます。
guest

回答1

0

ベストアンサー

エラーの原因は標準化するための関数sc.fit_transform()がデータフレームではなく、配列(ndarray)を返すためです。
つまり sc.fit_transform() は 従来 as_matrix()で行っていた配列化の処理も同時に行っていることになります。
しかしながら 配列 には drop()メソッドが無い為エラーを引き起こしてしまいます。

そこで、順番を少し変えて

データ取得 → 標準化 → 特徴データの分離(エラー)→ 特徴データの配列化

から

データ取得 → 特徴データを分離 → 標準化&配列化

とすると良いと思います。

順番を変えることでラベルデータは標準化されないことになりますが、もともとラベルデータを標準化する必要性が全くありませんので、逆に良いかとおもいます。

Python

1#訓練データ 2jockey = pd.read_csv("jockey_2.csv" , sep=",") 3 4# 訓練データより特徴データのみを取り出す 5jockey_except_arrival = jockey.drop("arrival", axis=1) 6 7# 特徴データを標準化して配列に入れる 8sc = StandardScaler() 9features = sc.fit_transform(jockey_except_arrival) 10 11# ラベルデータを取り出して配列に入れる 12targets = jockey['arrival'].as_matrix()

投稿2017/06/26 23:59

magichan

総合スコア15898

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

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

akakage13

2017/06/27 12:25

magichan様、懇切丁寧な御教示、ありがとうございました。 目からうろこ、発想がございませんでした。 今後とも、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問