やりたいこと
主成分分析を行い、データを低次元に表す。 その分布をクラスごとに可視化して、クラスごとに分布が違っている(分布が重なっていない)なら予測が簡単そうだ、とわかるしPCAを教師なしの線形分離器の見れば線形分離可能かも確認できそう。
データを二次元で可視化
from sklearn.decomposition import PCA from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt X, y = load_data() pca2d = PCA(n_components=2).fit(X) X_2d = pca2d.transform(X) true_label = X_2d[np.where(yd==1)] plt.scatter(true_label[:,0], true_label[:,1], marker='x', alpha=.5, color='b', label='T') false_label = X_2d[np.where(yd==0)] plt.scatter(false_label[:,0], false_label[:,1], marker='x', alpha=.3, color='r', label='F') plt.legend() plt.show()
データを二次元にまで圧縮して、それの散布図を確認する。
T, Fのクラスが完全に重なっているので、二次元では分離できそうにない。
データを三次元で可視化
from sklearn.decomposition import PCA from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt pca3d = PCA(n_components=3).fit(X) X_3d = pca3d.transform(X) fig = plt.figure() ax = Axes3D(fig) true_label = X_3d[np.where(yd==1)] ax.plot_wireframe(true_label[:,0],true_label[:,1],true_label[:,2], alpha=.5, color='b', label='T') false_label = X_3d[np.where(yd==0)] ax.plot_wireframe(false_label[:,0],false_label[:,1],false_label[:,2], alpha=.5, color='r', label='F') plt.legend() plt.show()
ちょっと適当にやりすぎたが、ちゃんとしたデータなら三次元空間で赤と青の塊が分かれてくれると思う。 完全に分かれていたら線形のモデル(ロジスティック回帰、リッジなど)でも簡単にできる問題とわかるはず。