見出し画像

【DataCamp】29_Unsupervised Learning in Python①, ②

教師なし学習の前半です。

①Clustering for dataset exploration

KMeans法でクラスタリングする。ラベルがあるものはクロス集計表を作成し、精度を確認する。

-アヤメ

画像1

まずはアヤメのデータをインポート。微妙にスライドと値が違います…。

画像2

がくの長さと花びらの長さの散布図を作成し、クラスターごとに色分けします。

画像3

がくの長さは1列目、花びらの長さは3列目です。

画像4

あれ?軸ラベルが表示されない…。

jupyter notebookをリセットしたら直りました!

画像5

クラスタリングの評価に、クロス集計を行います。

target_namesの0, 1, 2をそれぞれ'setosa' 'versicolor' 'virginica'に変換します。for文を使ったけれど、もっと簡単な書き方がありそう…。

画像6

画像7

画像8

スライドと順序は異なりますが、数は同じでした。


-grains

k-meansの慣性グラフ作成

今度はgrains。GrainsZIPを解凍すると、seeds, seeds-width-vs-lengthの2つのファイルがあります。今回はseedsの方を使います。seedsファイルを開くと、210行8列でした。最後の1列はラベルのようです。

DataCampの方で、samplesは210行7列であることを確認しました。

画像9

画像10

samplesの出力は、DataCampと同じみたいです。

画像11

inertiaの減少は、3から緩やかになるので、クラスターの数は3が良さそうです。

クラスター数3で、クロス集計表を作成してみましょう。しかし、ラベルの1, 2, 3が何を指すかよく分かりません。元データを見てみましょう。

UCI Machine Learning Repository seeds Data Set

Data Folder > Parent Directory, seeds_dataset.txt

Parent Directoryは上のディレクトリに移動するだけ。

seeds_dataset.txtの方は、コーストップにあるgrainsファイル内のseedsと同じ。

ラベルの説明は特にないけど、 Kama, Rosa and Canadianの順に1, 2, 3なのかな???

画像12

画像13

並びはDataCampと同じっぽいです。

クラスター数3で、クロス集計表を作成しました。

画像14


-ピエモンテ ワイン

このデータセットはヘッダーがあって、それぞれの列が何か分かりやすいです。

画像15

samplesとvarietiesを作成。ラベルの名前列があるのでラク…。

画像16

クラスター数3で、クロス集計表を作成しました。

画像17

イマイチ。データセットの特徴量の分散が大きく異なるのが原因。

画像19

分散の大きさの違いを見るため、od280とprolineの散布図を作成してみましょう。

画像19

画像20

あれ?エラー…。

画像21

画像22

今までのグラフを見直して、cで渡すのは、数値のリストでなければならないと気づきました。文字列のリストを渡すとエラーになります。

画像23

x軸とy軸のスケールを調整して

画像24

これを標準化します。27_Supervised Learning with scikit-learnの④でも出てきたStandScaler。

画像25

ワインのデータセットをクラスター化するには、StandardScalerで標準化して、KMeansする2ステップが必要。pipelineを使うと便利。

StandardScalerとKMeansオブジェクトを作成し、make_pipeline()関数を適用する。pipelineのfit_predictメソッドで、クラスターラベルを取得する。クロス集計表を作成する。

画像27

今度はクラスターラベルと品種がよく対応しています。


-fish

今度はfish.csvをインポートします。85行7列。headerがないので、それぞれの列が何を表しているか分かりません。元データを確認します。

Journal of Statistics Education

スクロールしていくと、fishcatch.dat.txtとfishcatch.txtがありました。fishcatch.dat.txtは159行9列のデータ。fish.csvと違い、1列目は数字です。

fishcatch.txtの方に説明があります。1:観察番号、2:種類、3:重量、4~6:長さ、7:高さ%、8:幅%。fish.csvには1:観察番号がありません。2:種類ですが、

画像27

fish.csvはコードをSpeciesのEnglish ver.にしてありますね。Bream, Roach, Smelt, Pikeのみ。Whitewish, ?, Perchはナシ。

DataCampのsamples.shapeは(85, 6)。fish.csvの0列目の種類を削除してsamplesにします。

画像29

まず、各列の分散を調べます。

画像50

標準化せずにクラスター化して、クロス集計表を作成すると

画像51

Breamが0と3にばらけて、RoachとSmeltはどちらもラベル1…。

StandardScalerで標準化して、KMeansでクラスター化。

画像30

クロス集計表を作成し、クラスターラベルと品種を比較。

画像31

よく対応しています。


-company-stock-movements

次は株価の動きです。終値と始値の差(ドル)。DataCampのmovementsは60行963列のnumpy array。

画像32

画像33

画像34

画像35

あれ?エラー…。

df.drop(df.columns[列番号], axis=1)でいけました。grainsはdf.drop(列番号, axis=1)でいけたのに、なぜ???

画像36


画像37

行ごとの平均値を見てみます。

画像38

分かりにくいので、棒グラフにしてみましょう。

画像39

画像40

一番小さいのはAppleで-0.3。一番大きいのはMasterCardの0.25。

Normalizerを用いて正規化します。

class sklearn.preprocessing.Normalizer(norm='l2', *, copy=True)
L2正規化がデフォルト。

https://qiita.com/panda531/items/4ca6f7e078b749cf75e8

L2正規化は、半径1の円上へのベクトルに変換しているらしいです。(StandardScalerは標準化。元のデータの平均を0、標準偏差が1のものへと変換する)

画像44

画像45

画像46

最大値と最小値の比較

画像47

画像48

10個のクラスターに分けてラベルを付けます。

画像41

画像42


②Visualization with hierarchical clustering and t-SNE

eurovisionはよく分からないのでパス。NaNあるし。

-grains

再び。

画像48

なんか気持ち悪い感じになっちゃった…と思ったら、DataCampの方のsamples、(42, 7)にデータ減らしていた…。

大体、品種ごとにクラスターに分かれています。

次はクラスターが3つになっている高さ8でクラスターラベルを抽出します。

画像50

少し混ざってますが…。

-stocks

scipy.cluster.hierarchyはpipelineに対応していない。

画像49








この記事が気に入ったらサポートをしてみませんか?