Anaconda Spyder(Python)に問題があります。
オブジェクトタイプの配列は、Windows 10では変数エクスプローラーに表示されません。 XまたはYをクリックすると、エラーが表示されます。
オブジェクト配列は現在サポートされていません。
Win 10 Home 64ビット(i7-4710HQ)とPython 3.5.2 | Anaconda 4.2.0(64ビット)[MSC v.1900 64ビット(AMD64)]
(Spyder開発者はこちら)Spyderにオブジェクト配列のサポートが追加されます4、2019年にリリース予定です。
良い例はこちら
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dataset = pd.read_csv('Salary_Data.csv') #in your case right name of your file
X=dataset.iloc[:,:-1].values #this will convert dataframe to object
df = pd.DataFrame(X)
データフレームでデータを表示できます。これにより、arrrayがデータフレームに変換されます。
また、変数Explorerはデータフレームを受け入れます。上記は正しいコードです
dataFrame
と.values
なしで同じものを使用しました。
それは私のために働いた。
x = dataset.iloc[:, :-1]
y = dataset.iloc[:,3]
解決策:スパイダーのバージョンを3.2.0にダウングレードします
これを行うには、anaconda-navigatorにアクセスします。
機械学習に関するUdemyコースを受講している場合、おそらくインストラクターは古いバージョンのスパイダーを使用しており、彼のために働いています。 3.2.8などの新しいバージョンでは機能しませんが、将来のバージョンに組み込むことができます。
point が失敗するまでコードを分析しました。
Spyderの配列エディターは、混合型の配列(オブジェクト配列)の表示をサポートしていないようです。
ここで サポートされている形式 を見ることができます。
初めて使用したときに混乱を招きました。データセットをクリックすると、配列変数をクリックしても同じエディターが表示されます。
タイプarrayの変数の場合、ArrayEditorウィジェットを受け取ります。呼び出しが行われたと思います ここ 。
ただし、タイプDataFrameの変数の場合、DataFrameEditorを受け取ります。呼び出しが行われたと思います ここ
問題は、両方のウィジェットがほぼ同じに見えるため、両方のケースで同じ結果を受け取ると考える傾向がありますが、DataFrameEditorは混合型を許可し、ArrayEditorではありません。
適切なウィジェットのサポートがSpyderで最終的にリリースされるまで、IPythonコンソールで配列変数を検査することができます。
次のコードを使用します。
dataset = pd.read_csv('Data.csv')
X = pd.DataFrame(dataset.iloc[:, :-1].values)
変数の型が同じでなく、変数エクスプローラーでこれがオブジェクトとして表示される限り、変数は同じ場合に同じ型に変換する必要があることを意味します。 fit_transform()を使用して修正できます。
そのチュートリアルのコードの関連部分は次のとおりです。
from sklearn.preprocessing import LabelEncoder , OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_1.fit_transform(X[:, 2])
onehotencoder = OneHotEncoder(categorical_features = [1])
X = onehotencoder.fit_transform(X).toarray()
これは、配列に複数のデータ型があるため、単一の型を選択できないため、複数のデータ型を持つオブジェクトを表示できないためです。それを見ることができます。
Spyderで変数ビューアーをバイパスするには、2つの方法があります。あなたはどちらか
A)「print(X)」を使用してXの内容を明らかにする、または
B)Xを入力してReturnキーを押すだけで、IPythonコンソールを簡単に使用できます。これにより、説明したML関数が機能しているかどうかを迅速に明らかにすることができます。
スパイダーの更新バージョンでは、変数エクスプローラーを使用して混合配列を表示できなくなりました。代わりにコンソールで配列を印刷して検査できます。
Spyderではまだサポートされていませんが、変数名を直接入力することにより、IPyhon Consoleを使用してこれらの値を印刷できます。
これは私のために働いた:
import pandas as pd
labels = pd.read_csv('labels/labels.csv')
# object arrays are currently not supported exception
breeds = labels.breed.unique()
# Supported Version
# working fine
breeds = pd.DataFrame(labels.breed.unique())
追加
X = pd.DataFrame(X)
xオブジェクトをデータフレームに変換し、スパイダーでもエラーなしでチェックできるようにします。
私のために働いた!
y
、つまりx[: , 0] = labelencoder_x.fit_transform(x[:,0])
と同じようにx
変数に正確なフォーマットを使用することを主張し、y[:] = labelencoder_y.fit_transform(y[:]) *(taking into account the syntax for the fit transform for y)*
を使用したため、同様の問題が発生しました。
上記により、y_test
およびy_train
"object"のdtypeが作成されました。これらは、変数ExplorerのSpyderでは表示できません。
インストラクターが使用する正確な行を使用した場合:y = labelencoder_y.fit_transform(y)
。 dtypeは、変数Explorerで表示できるint64
に変更されました。
データが同じタイプの例intまたはfloatの場合、変数Explorerに表示されます。そうでない場合、たとえばデータにstringとintがある場合はサポートされません。
ただし、データをチェックするソリューションがあります。IPythonConsoleで実行できます。
同じ問題がありました。問題は行だった
oneHotEncoder.fit_transform(X).toarray()
これは、データをX配列に割り当てません。代わりに、次の行で問題を修正する必要があります。
X=oneHotEncoder.fit_transform(X).toarray()
これは、データがエンコードされていないためです。すべてのカテゴリデータを「エンコード」する必要があります。 sypder( https://i.stack.imgur.com/uApwt.jpg )の変数Explorerのデータを見ると、Xには国に関するデータが含まれていることが明らかです([France 、44.0、72000])。したがって、国の名前をエンコードする必要があり、同様にyには「Yes」または「No」が含まれているため、エンコードする必要もあります
行21の後に次のコードを追加すると、オブジェクト配列が表示されます。
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
'''
To prevent the machine learning equations from thinking
(if there are more than one country) that one country is greater than
another, use the concept of dummy variables
'''
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
'''
Since y is dependent variable, the machine learning model will know
that its a category, so we are going to use only the LableEncoder()
'''
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)