前提・実現したいこと
PCA解説 sklearnで主成分分析を試してみよう!
上記のサイトのソースコードをコピペしてPCAを実行しましたが、
エラーがでましたのでそれを解決したいです。
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-31-8a964de16c1f> in <module> 38 39 # embed3dはT-SNEで作った三次元のデータフレームです。 ---> 40 embed3d.iplot(kind="scatter3d", # 種類=3D散布図 41 x="X", y="Y", z="Z", # x軸,y軸,z軸を指定 42 mode="markers", # プロットの見た目を変える指定です ValueError: Invalid value of type 'numpy.int32' received for the 'name' property of scatter3d Received value: 0 The 'name' property is a string and must be specified as: - A string - A number that will be converted to a string
該当のソースコード
python
1from matplotlib import pyplot as plt 2 3import numpy as np # Pythonで機械学習をするならとりあえずimport 4from sklearn.decomposition import PCA # 今回の主役。scikit-learnのPCAクラス 5from sklearn import datasets # デモ用のデータセットを読み込むモジュール 6import seaborn as sns # 可視化用のライブラリ 7import pandas as pd # 便利なDataFrameを使うためのライブラリ 8import cufflinks as cf # おしゃれな可視化のために必要なライブラリ その2 9 10cf.go_offline() # cufflinksをオフラインで使うため 11 12wine = datasets.load_wine() # wineデータを読み込み 13df = pd.DataFrame(wine.data) # DataFrame形式に変換 14df["label"] = wine["target"] # データのクラスをDataFrameの列の一つとして追加 15df.head() # 試しにDataFrameの先頭5行を表示してみましょう 16 17sns.pairplot(df.iloc[:,:-1]) # df.iloc[:, :-1]にすることですべての行の 18 # 最後の列以外を指定して可視化します 19plt.show() 20 21pca = PCA(n_components=3) # 3次元に圧縮するPCAインスタンスを作成 22X = pca.fit_transform(df.iloc[:,:-1].values) # wineデータをPCAで次元圧縮 23embed3 = pd.DataFrame(X) # 可視化のためにデータフレームに変換 24embed3["label"] = df["label"] 25embed3.head() # データフレームの先頭を表示 26 27embed3.iplot(kind="scatter3d", x=0,y=1,z=2,categories="label")
試したこと
github
上記のサイトに似たエラーがありましたので参考にしましたが、
どこをいじればよいかわからず、解決されませんでした。
以下は上記のサイトに書いてあった解決方法です。
I have made a python script to draw a 3D scatter map. Usually I can draw it online by the code: x = [] y = [] z = [] hover = [] trace = {} layout = {} #creating trace for i in range(len(np.unique(y_le))): name = np.unique(y_random)[i] # color = range(len(X_tsne['Name'].unique))[i] color = c[i] x = X_tsne[y_random == name][:, 0] y = X_tsne[y_random == name][:, 1] z = X_tsne[y_random == name][:, 2] hover = filename_random[y_random == name] trace = dict( name=name, x=x, y=y, z=z, type="scatter3d", mode='markers', # colorscale='Viridis' text=hover, marker=dict(size=2, color=color, line=dict(width=0))) data.append(trace) #creating fig layout = dict( width=1600, height=1200, autosize=False, title='t-SNE embedding - hover', scene=dict( xaxis=dict( gridcolor='rgb(255, 255, 255)', zerolinecolor='rgb(255, 255, 255)', showbackground=True, backgroundcolor='rgb(230, 230,230)' ), yaxis=dict( gridcolor='rgb(255, 255, 255)', zerolinecolor='rgb(255, 255, 255)', showbackground=True, backgroundcolor='rgb(230, 230,230)' ), zaxis=dict( gridcolor='rgb(255, 255, 255)', zerolinecolor='rgb(255, 255, 255)', showbackground=True, backgroundcolor='rgb(230, 230,230)' ), aspectratio=dict(x=1, y=1, z=0.7), aspectmode='manual' ), ) fig = dict(data=data, layout=layout) url = py.plot(fig, filename='tSNE embedding') However, when I tried to draw them offline by this: plotly.offline.plot(fig)
it raises the error
ValueError:
Invalid value of type 'numpy.int64' received for the 'name' property of scatter3d
Received value: 0
The 'name' property is a string and must be specified as:
- A string
- A number that will be converted to a string
I tried to replace the line name = name in making trace by using name = '%d' % name but it still the same error
How can I draw offline plot by plotly in this case?
以下は問題に対する解決策です。
The error message is talking about about the name property that you specify on this line: trace = dict( name=name, # <- Here x=x, y=y, z=z, ... ) This property must be a Python string or a Python number (int or float) and it's receiving a numpy int64 object. Try casting the numpy int to a Python int like this: trace = dict( name=int(name), # <- Here x=x, y=y, z=z, ... )
補足情報(FW/ツールのバージョンなど)
windows10を使用。
jupyter notebookに出力された詳細なエラー内容を追記しました。
ValueError Traceback (most recent call last) <ipython-input-25-edb1ce2e1dfc> in <module> 25 embed3.head() # データフレームの先頭を表示 26 ---> 27 embed3.iplot(kind="scatter3d", x=0,y=1,z=2,categories="label") ~\anaconda3\lib\site-packages\cufflinks\plotlytools.py in _iplot(self, kind, data, layout, filename, sharing, title, xTitle, yTitle, zTitle, theme, colors, colorscale, fill, width, dash, mode, interpolation, symbol, size, barmode, sortbars, bargap, bargroupgap, bins, histnorm, histfunc, orientation, boxpoints, annotations, keys, bestfit, bestfit_colors, mean, mean_colors, categories, x, y, z, text, gridcolor, zerolinecolor, margin, labels, values, secondary_y, secondary_y_title, subplots, shape, error_x, error_y, error_type, locations, lon, lat, asFrame, asDates, asFigure, asImage, dimensions, asPlot, asUrl, online, **kwargs) 796 else: 797 _size=size --> 798 _data=Scatter3d(x=_x,y=_y,mode=mode,name=_, 799 marker=dict(color=colors[_],symbol=symbol,size=_size,opacity=opacity, 800 line=dict(width=width)),textfont=tools.getLayout(theme=theme)['xaxis']['titlefont']) ~\anaconda3\lib\site-packages\plotly\graph_objs\_scatter3d.py in __init__(self, arg, connectgaps, customdata, customdatasrc, error_x, error_y, error_z, hoverinfo, hoverinfosrc, hoverlabel, hovertemplate, hovertemplatesrc, hovertext, hovertextsrc, ids, idssrc, legendgroup, line, marker, meta, metasrc, mode, name, opacity, projection, scene, showlegend, stream, surfaceaxis, surfacecolor, text, textfont, textposition, textpositionsrc, textsrc, texttemplate, texttemplatesrc, uid, uirevision, visible, x, xcalendar, xsrc, y, ycalendar, ysrc, z, zcalendar, zsrc, **kwargs) 2327 _v = name if name is not None else _v 2328 if _v is not None: -> 2329 self["name"] = _v 2330 _v = arg.pop("opacity", None) 2331 _v = opacity if opacity is not None else _v ~\anaconda3\lib\site-packages\plotly\basedatatypes.py in __setitem__(self, prop, value) 4017 # ### Handle simple property ### 4018 else: -> 4019 self._set_prop(prop, value) 4020 else: 4021 # Make sure properties dict is initialized ~\anaconda3\lib\site-packages\plotly\basedatatypes.py in _set_prop(self, prop, val) 4335 return 4336 else: -> 4337 raise err 4338 4339 # val is None ~\anaconda3\lib\site-packages\plotly\basedatatypes.py in _set_prop(self, prop, val) 4330 4331 try: -> 4332 val = validator.validate_coerce(val) 4333 except ValueError as err: 4334 if self._skip_invalid: ~\anaconda3\lib\site-packages\_plotly_utils\basevalidators.py in validate_coerce(self, v) 1080 v = str(v) 1081 else: -> 1082 self.raise_invalid_val(v) 1083 1084 if self.no_blank and len(v) == 0: ~\anaconda3\lib\site-packages\_plotly_utils\basevalidators.py in raise_invalid_val(self, v, inds) 273 name += "[" + str(i) + "]" 274 --> 275 raise ValueError( 276 """ 277 Invalid value of type {typ} received for the '{name}' property of {pname} ValueError: Invalid value of type 'numpy.int32' received for the 'name' property of scatter3d Received value: 0 The 'name' property is a string and must be specified as: - A string - A number that will be converted to a string
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー