プログラミングを始めた話~scikit-learnとかそのあたり~
※基本的にこの記事をチュートリアルに勉強しております
【機械学習入門・初心者】Kaggleのチュートリアルコンペティションに挑戦してみた - Qiita
というわけで昨日の続き。importされているscikit-learnについて→ぐぐる
今回はこの記事も参考にするよ!
このライブラリの中に、手書き文字セットというサンプルデータセットが入っていて、それでまずはチュートリアル。
digits = datasets.load_digits()
import matplotlib.pyplot as plt
plt.matshow(digits.images[0], cmap="Greys")
plt.show()
とりあえずload_digitsってなんやねんってとこからはじまってぐぐる→そういうデータ名でしたみたいな…。うーん…。
次。matplotlib.pyplot
qiita.comデータの可視化のためのパッケージっぽい。深入りすると延々時間とられてまずそうなのでとりあえずここでやめとく。とりあえずpyplotで色んなグラフが描けるみたいなところでここはひとつ。matshowがいまいちわからん→放置()
でデータをテストデータとトレーニングデータに分ける必要がある。
『学習』なので学習させる元データと妥当性を検証するデータに分割するのが常套手段らしい。まあそれはそう。方法は?→ぐぐる
pythondatascience.plavox.infotrain_test_splitモジュールで分割するらしい。割合は0~1.0で指定。
色々読んだ結果、機械学習系列では元のデータセットを洗練していくのがとても大事ということでこっちに時間をかけるっぽい。
とりあえず今回はモデル作成へ。
from sklearn import svm
clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)
当然のようにSVMがわからんのでぐぐる。→サポートベクターマシーンの略
おおサポートベクターマシーンは聞いたことあるぞ。忘れたけど。→ぐぐる
よくわかるサポートベクターマシーン(本当か?)。
ものっそい簡略化した理解をすると、説明変数のパラメーターから目的変数をそれなりに正確に分類・回帰しようとするときに、うまーく分類できる線形超平面を選択するって話のような気がする(本当か?)
qiita.com要は外れ値(分類した時に間違っちゃうサンプル)があった時にそれを許容する際に選択するっぽい。ほかにもlinearとかNuとかあるらしいけど、深追いすると死ぬので今回はここまで。
続いてgammaの設定がようわからんぐぐる→まずはRBFカーネルをわからないとダメっぽい→そもそもカーネルって何?
qiita.comでまずはその基礎で線形回帰。一次関数の回帰モデルを考えたときに、実測値とのズレを最小化する一番あてはまりのいいモデルを考えましょーというとき、どうするかというお話。
結論としては回帰モデルの目的変数Yと実測値のyの差を二乗したものを全部足して値が最小になったものが一番いいモデルにするってことっぽい。確かに直観的にはそれっぽい(妥当性が証明できてないけどドツボにはまりそうなので止めておく)。
で最小値の求め方として、下に凸の二次関数なので偏微分して極値でいいよね、と書いてあるのだが、大学でやったようなやらないような…。偏微分の記憶が無に等しいので偏微分をぐぐる。
qiita.comとりあえず変数を一つに絞って微分することらしい。なるほど(それになんの意味があるかはわかっていない段階。まあ後々わかるやろ)。
大学時代ベクトル(というか行列)で微分式とか表すの抵抗あったけど、こうしてみると確かに使わないとめんどくさいですね()
で、これを応用して多重線形回帰。変数がいっぱいみたいなやつ。これとglmの違いが判らん。とりあえず放置。
https://it-mint.com/2017/07/19/kernel-multivariate-analysis-1207.html
これが一番わかりやすかった。要はあえてデータを高次元に移動してうまく回帰しましょうという発想っぽい。
このへんでちょっと袋小路に入ってしまいギブアップ。とりあえずgamma値が低いほどモデルが単純化されるという話っぽい。
でfitの話。KNeighborsClassifierって方法をfit関数だけでやっているらしい。すごい。
いい加減元記事でそろそろ先に進む。多少のブラックボックスは初学者でしょうがないので後でちゃんとやるとする(やるのか?)
train['Name_length'] = train['Name'].apply(len)
乗客の名前の文字数を新たなデータとして追加する作業。
こういうあるデータ列に対して全適応するときは ファイル名[列の名前]を.前につけるっぽい。で.apply()は.の前の指定物に対して()内の関数を全て適応させる関数くさい。
applyはpandasのDataFlame関数みたいですね。
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
同様にapply関数を使って客室持ちの客かどうかを判断する関数を作っている。
lambdaはその場限りの関数を適用します、という意味。あんま使わない関数を一々定義するのもねえ…というときに使うらしい。
で、式から察するに多分lambda文は普通のif文みたいな複数行の書き方が出来なくて、書き方が特殊になっている気がする。
意味合いとしては
lambda x: ←xについて:以下のように考えますよ。
0 if type(x)== folat←変数xの型がfloat(小数点許容の数字)なら0(ここが普通のif文と逆)
else 1←それ以外は1にする。
…ちょっとまって。元データを見返すと客室ありの人は、客室番号をC85みたいな文字+数字だから1になるのはわかるが、なしの人はNANになってるぞ。floatじゃないやん。why japanese people←ぐぐる
note.nkmk.meNANはpandasライブラリの中ではfloat扱いらしいです。便利すぎる。
とりあえず今日はここまで。ふいー疲れた。