【機械学習・データ分析を勉強している方必見】オススメの本2選!

こんにちは!EMです^^

 

今回は私が最近読んだ機械学習系の本を紹介していきたいと思います!

 

サイトで検索する事も、勉強にはかかせませんが
やはり本を読むと、全体的の流れがつかみやすいのと
情報の中身がかなり安定しているので、信頼できる情報が多いです。

サイトの中には最新の情報もあれば、古い情報もありますからね。

 

ということで、私の好みで選んだ
めっちゃ分かりやすくて為になると思った本を2冊紹介します!!

 

まずはこちら↓↓

 
 これは、もっと早く出会いたかったと思った本です。
この中にはお客様の声や、ECサイトの分析をするなら、小売店の分析をするなら、、
とそれぞれ起こりうる問題や解決策を、実務目線でまとめてくれています。
 
個人的な経験からですが、機械学習やデータサイエンスの基礎をおさえた
本や情報はたくさん見つかるのですが、独学学習者からすると
実際の現場でどのような依頼を受けるのかは未知なんですよね。
(もちろん現場によってそれぞれだと思いますが…)
 
また、私が小売店で勤務していることもあり、自分の業務と
照らし合わせて使える内容ばかりだったので、とても重宝しています。
 
という事で、ざっくりでも基礎を学んだ方には
データサイエンティストがこんな事をしているというイメージを掴むためにも
ぜひ読んでみてほしい一冊です!
 

 

さて、次の本にいきましょう。

 
 
さて、この本にはデータ分析に必要なすべてを網羅しているといっても
過言ではありません!(個人的な意見です)
特に文系の人に苦手意識があるのではなかろう、確率や統計についても
きっちりまとめてくれています!
 
もちろん初めて見る専門用語ばかり、、という人には
一度で理解するのはむずかしいかもしれません。
 
ただ図や公式なども含めて解説してくれていて
「この内容を理解したいから、この単語を調べてみよう!」という
何が分からないかを明らかにしてくれる、基礎固めのとっかかりが出来る本かな
と思っています。

私は1冊目の本から疑問があれば、2冊目の本で調べて
分からないところを時間をかけても理解していく、という勉強をしています。
 
 
正直にいうと、私はkindleの電子書籍を購入したのですが
パソコン版でみると、メモやハイライトを残したりできる機能が使えず
やはり紙の方が付箋とか使えて使いやすいなぁと感じました。
 
ただ移動が多い方はやはり持ち運びはしやすいので
電車などの通勤時間に見て勉強はしやすいです。
 
まぁ何事も長所短所はありますからね。
 
 
という事で、今回はいちおしの書籍を紹介させて頂きました^^
 
最後まで読んで頂きありがとうございました!
 
 

分類アルゴリズム~決定木④アンサンブル手法~

 こんにちは!EMです^^

 

今回も引き続き決定木シリーズを解説していきます!

メインのテーマはアンサンブル手法です!

 

アンサンブル手法(Ensemble methods)

ランダムフォレスト:

たくさんの決定木を並行して構築し、多数決を使用して
出力を1つのモデルにかしこく結合します。

合計データのサブセット(サンプリング)が各決定木に使用され
最後に集計(バギング:bagging)が行われてすべてがまとめられます。

 

ブーストツリー:

たくさんの決定木を連続して構築します。

後続のモデルは、前のモデルのエラーを元に構築されます。

この構成では、前のモデルで捉えられなかった効果に追加のモデルが適合します。

そして最後に、異なるモデルが一緒に追加されて最終的な結果が得る事が出来ます。

 

ランダムフォレスト

from sklearn.ensemble import RandomForestClassifier

random_forest_model = RandomForestClassifier(n_estimators=50, max_depth=5)
random_forest_model.fit(X_trn[features_to_include], Y_trn)
 
print('accuracy on training data',random_forest_model
    .score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',random_forest_model
    .score(X_tst[features_to_include], Y_tst))
 
【output】
accuracy on training data 0.8004733727810651
accuracy on test data 0.8030518097941802
 
 
【2つの特徴に絞った場合】
 
random_forest_model_2feat = RandomForestClassifier(n_estimators=50, max_depth=5,)
random_forest_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',random_forest_model_2feat
.score(X_trn[two_features], Y_trn))
print('accuracy on test data',random_forest_model_2feat
.score(X_tst[two_features], Y_tst))
 
【output】
accuracy on training data 0.7988165680473372
accuracy on test data 0.7934705464868701
 
 
PlotBoundaries(random_forest_model_2feat, X_tst[two_features].values,Y_tst) 
 

f:id:tennisfashionista:20210217234734p:plain

 
木を基にした機械学習の利点として、機能の重要度のランク付けが出来る事にあります。
これを利用する事で、モデルの解釈の可能性に非常に役に立ちます。
 
 
df_feat_importances = pd.DataFrame(list(zip(features_to_include,
            random_forest_model.feature_importances_)), 
            columns=['Feature','Importance'])
df_feat_importances.sort_values(by='Importance', inplace=True)
 
 
plt.figure(figsize=[6,8])
plt.barh(df_feat_importances['Feature'],df_feat_importances['Importance'])
 

f:id:tennisfashionista:20210217235403p:plain

 
 
 

勾配ブースト木(Gradient Boosted Trees)

※ここでは出力結果を割愛しています。ぜひ一度どんな結果が出るか試してみてください^^ 

from sklearn.ensemble import GradientBoostingClassifier

gbm_model = GradientBoostingClassifier(n_estimators=50, max_depth=5
                     min_samples_leaf=100)
gbm_model.fit(X_trn[features_to_include], Y_trn)
 
print('accuracy on training data',gbm_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',gbm_model.score(X_tst[features_to_include], Y_tst))
 
 
 
 
gbm_model_2feat = GradientBoostingClassifier(n_estimators=50, max_depth=5
                        min_samples_leaf=100)
gbm_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',gbm_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',gbm_model_2feat.score(X_tst[two_features], Y_tst))
 
 
 
PlotBoundaries(gbm_model_2feat, X_tst[two_features].values,Y_tst) 
 
 
もう一度、機能の重要度を見てみましょう。
 
df_feat_importances_gbm = pd.DataFrame(list(zip(features_to_include,gbm_model.
              feature_importances_)), columns=['Feature','Importance'])
df_feat_importances_gbm.sort_values(by='Importance', inplace=True)
 
 
plt.figure(figsize=[6,8])
plt.barh(df_feat_importances_gbm['Feature'],df_feat_importances_gbm['Importance'])
 
 
 
 

 

 

いかがだったでしょうか?

私自身のデータを当てはめた時は、過学習をする事もあり
色々と値を調整しながら当てはめていました。

 

もしもっと知りたい!という方は、ぜひコメントを残して頂くか
プロのエンジニアの方に効率的に学んでいくのをオススメしています。

 

↓↓データ分析コースなどなど↓↓ 
 

 

ぜひご検討ください^^

 

最後まで読んで頂きありがとうございました!

分類アルゴリズム~決定木の視覚化~

こんにちは!EMです^^

 

今回も引き続き、決定木の特に視覚化について学んでいきたいと思います。

 

決定木の視覚化(visualizing trees)

構築した決定木を視覚化していきましょう。

その為に、プログラムを含む2つの新しいパッケージをインストールしていきます。

 

 

 1.オペレーティングシステムにGraphvizをダウンロードします       

   https://graphviz.gitlab.io/download/


 2.Anaconaプロンプトから、conda install graphvizを実行します

 

 3.conda install pydotplusを実行します

 

from sklearn.externals.six import StringIO  
from IPython.display import Image  
from sklearn.tree import export_graphviz
import pydotplus
 
 
フィットモデル(DT_model)を使い、次のスクリプトを実行して木を視覚化できます。
 
dot_data = StringIO()
export_graphviz(DT_model_2feat, out_file=dot_data, feature_names=two_features, 
         class_names=['no','yes'],rounded=True, filled=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
Image(graph.create_png())
 
 

f:id:tennisfashionista:20210216014139p:plain

 

 

これが英語なので少し分かりにくいですが、決定木がどのように

派生しているのかというのが視覚的にイメージができやすいかと思います。

また正則化する時にも、どの程度の大きさの木を構築したいなどの

ボリューム感を掴むには、こういった方法で確認するのも一つの方法ですね。

 

またもし本気で今勉強している、したいという方は
ぜひプロのお話を聞くのもおすすめしています。
私のブログでも今後幅広く、内容を解説していきたいと思っていますが
本気で勉強したいという人を応援したいので、ぜひ効率の良い方法もご検討ください。
 
 
↓↓データ分析コースなどなど↓↓ 
 

 

それでは今回は短いですが、ここまでにします。

また次回もお楽しみに~^^

分類アルゴリズム~決定木②~

こんにちは!EMです^^

 

 

今回も引き続き、決定木について解説していきたいと思います。

 

決定木①では決定木が過学習しやすいというお話をしました。

では過学習してしまった時、どのように対処していくのかという事を
みていきましょう。

 

正則化(Regularization)

過学習をコントロールする方法として、事前剪定(pre-pruning)
と呼ばれる手法があります。

決定木は字のごとく木に例えられているので、木の枝が長くなる前に
刈ってしまうというイメージですね。

もしくはポスト剪定(post-pruning)といって、モデルを適合する間に
決定木の長さを調整をしていう方法もよく使われます。

これは一度モデルを適合した後に、決定木の長い枝を切っていくものなのですが
残念ながらsklearnの中には実装されていません。

 

ここでは2つの事前剪定手法に注目していきたいと思います。

 

 1.max_depthを使用して、枝(ノード)の数を制限します。
   これにより、木全体の複雑さが制限されて、個々のデータポイントごとに
   必要以上に過学習を招く事を防ぎます。

    2.min_samples_leafを使用して、各エリアがカバーする必要のある
   データポイントの数に下限の値を設定します。
   これにより、決定木はデータ量の多い領域に適合し
   少ないデータポイントごとに特定の領域が作られるのを防ぎます。


どちらの手法も比較的うまく機能する事が多いです。

詳細については、こちらのサイトも参照してみてください。

http://scikit-learn.org/stable/modules/tree.html#tips-on-practical-use

 

DT_model_2feat = tree.DecisionTreeClassifier(max_depth=5, min_samples_leaf=50)
DT_model_2feat.fit(df[two_features], df['Churn'])
PlotBoundaries(DT_model_2feat, X_tst[two_features].values,Y_tst) 
 

f:id:tennisfashionista:20210214233047p:plain

 

DT_model_2feat = tree.DecisionTreeClassifier(max_depth=3, min_samples_leaf=50)
DT_model_2feat.fit(X_trn[two_features], Y_trn)

print('accuracy on training data',DT_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',DT_model_2feat.score(X_tst[two_features], Y_tst))
 
 
【output】
accuracy on training data 0.7815384615384615
accuracy on test data 0.7867281760113556
 
Notice how much simpler our boundaries are, and how there was minimal dropoff in accuracy on unseen data
 
前回の出力結果に比べると、プロット図がよりシンプルになったこと
またテストデータの精度の低下が最小限になり、過学習を解消できたという点に
お気づきになりましたか?
 
 
次回は決定木の違った形の視覚化について、解説していきたいと思います^^
 
 
またもし本気で今勉強している、したいという方は
ぜひプロのお話を聞くのもおすすめしています。
私のブログでも今後幅広く、内容を解説していきたいと思っていますが
本気で勉強したいという人を応援したいので、ぜひ効率の良い方法もご検討ください。
 
 
↓↓データ分析コースなどなど↓↓ 
 
 
 
最後まで読んで頂きありがとうございました^^

分類アルゴリズム~決定木①~

こんにちは!EMです^^

 

さっそく今日も分類アルゴリズムシリーズをはじめていきたいと思います。

今日のテーマは「決定木」です!

 

 

決定木(Decision Trees)

決定木はイメージしやすいかもしれません。

例えば、10個ほどの質問をして、答えにたどり着くタイプの質問がよく
身近に目にするかと思います。

例えば、回答者は人や物や場所などについて考え、yesまたはnoで答えていきます。

そしてその導かれる答えによって、最終的な回答を予想していきます。

問題を進めていくほど、その回答によって考えられうる解決策を
狭めていく事ができます。

例をいうと「これは動物ですか?」という質問に「はい」と答え
「4本の足がありますか?」の答えが「いいえ」だった場合。

これは明らかに豚、羊、牛、犬などの4足歩行の動物は削除する事が出来ますよね。

この様に、最終的にはうまく答えにたどり着くという流れです。

 

f:id:tennisfashionista:20210212011738p:plain

決定木の木はノード(◇の結び目の部分)で構成され
一番上のノードをルートノード(根っこのノード)と言います。
各ノードは属性のテストを表します。

例えば、「色は『赤』」や「重量は『10kg未満』ですか?」などの質問が
各ノードに入ります。

 

さらに決定木は、階層モデルの例です。

木がもつ各ノードは、情報を蓄積しており、上からの情報を下に流しています。

 

一番下の先のないノードの事をリーフノード(木の葉っぱのイメージ)と言います。

リーフノードにたどり着くと、私たちは決定を下したり、結果を得る事が出来ます。

最終的にたどり着いたリーフノードは、その中から一番可能性の高い決定・結果を
表しています。

 

一般的に、決定木は元の特徴(feature)タイプに影響されません。

継続的な特徴である場合、自由に値を分割できます。

もし独立変数が連続的な特徴値 Xを持っている場合、分割は値 V で行うことができ
Xi≤V が左の枝になり、すべての値Xi≥Vが右側の枝になります。

分離した特徴には、クラス値で分割できます。

treeパッケージを使用して、決定木を構築してみましょう。

 

from sklearn import tree
 
#fitting the DT
DT_model = tree.DecisionTreeClassifier()
DT_model.fit(df[features_to_include], df['Churn'])

DT_model.score(df[features_to_include], df['Churn'])
 
【output】
0.9974442709072838
 
 
DT_model_2feat = tree.DecisionTreeClassifier()
DT_model_2feat.fit(df[two_features], df['Churn'])
PlotBoundaries(DT_model_2feat, df[two_features].values, df['Churn']) 
 

f:id:tennisfashionista:20210213002950p:plain

 

2つの特徴の境界プロット(上の図)から見ての通り、決定木は過学習をする傾向があります。

ここでも、私たちが作ったデータと同じもので仮説を検証するべきではないので
テスト/トレーニングデータを使用してみましょう。

DT_model = tree.DecisionTreeClassifier()
DT_model.fit(X_trn[features_to_include], Y_trn)

print('accuracy on training data',DT_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',DT_model.score(X_tst[features_to_include], Y_tst))
 
【output】
accuracy on training data 0.9978698224852071
accuracy on test data 0.7331440738112136
 
 
目に見えないデータ(テストデータ)を使用すると
精度が一気に低くなった事に気づきましたでしょうか。
これは先程の通り、トレーニングデータ上で過学習をしている可能性が高いというサインです。
 
 
次回では正則化(regularization)を通じて、過学習をしてしまった際に
どのように決定木を改善していくのかを見ていこうと思います!
 
 
もしブログでは情報が足りない、、という方は
ぜひリクエストやコメントをお待ちしております。
また本格的に学びたい!という方は、ぜひプロにしっかり学ぶというのも
1番効率がいいのは間違いありません。
時間を無駄にしたくないという方は、ぜひ無料体験等で一度
どのように学べるのか試してみてくださいね^^
 
 
 
 
それでは次回もお楽しみに~!!
 
 
 
 

 

分類アルゴリズム~SVM~

こんにちは!EMです^^

 

今回も分類アルゴリズムシリーズとして、解説していきたいと思っています。

今日はサポートベクターマシーンです!

 

 

ロジスティック回帰と同様に、サポートベクターマシーン(SVM)は
2つのグループの間にまっすぐな境界線を描きます。

ただし、ロジスティック回帰は境界線にシグモイド変換を適用し
闘値(少しズレると大きく変わるギリギリの値)を選択しますが
SVMは線を移動させることによってグループの間の分離を最適化します。

はじめて見ると、線形境界は制限の塊のように見えるかもしれませんが
今後扱っていくカーネル法だと、データをより高次元の空間に
マッピングできることがわかります。

つまり、異なる次元の空間の直線は、逆変換すると非線形になる可能性があります 。

 

SVC

from sklearn.svm import LinearSVC

SVM_model = LinearSVC()
SVM_model.fit(X_trn[features_to_include], Y_trn)

print('accuracy on training data',SVM_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',SVM_model.score(X_tst[features_to_include], Y_tst))
 
【output】
 
accuracy on training data 0.7768047337278107
accuracy on test data 0.7892122072391767
 
 
svm_model_2feat = LinearSVC()
svm_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',svm_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',svm_model_2feat.score(X_tst[two_features], Y_tst))
 
【output】
accuracy on training data 0.5581065088757396
accuracy on test data 0.5578424414478353
 
 
PlotBoundaries(svm_model_2feat, X_trn[two_features].values,Y_trn) 
 

f:id:tennisfashionista:20210207232514p:plain

 

 

カーネル法 SVM(Kernel SVMs)

SVMは直線の境界を描画しますが、はじめに問題をより高次元の空間にマッピングすることで
この制限をうまく避ける事ができます。

さらに異なる空間に描かれた直線を、クラス間の非線形境界にマッピングして戻すことができます。

このマッピング関数はカーネルと呼ばれます。

この方法の欠点は、カーネルを指定する必要があり、問題に対して
常に直感的であるとは限りません。

幸いなことにScikit-Learnは、放射基底関数など何通りかの組み込みカーネルを提供しています。

 

from sklearn.svm import SVC

kernel_SVM_model = SVC(kernel='rbf'#radial basis function mapping
kernel_SVM_model.fit(X_trn[features_to_include], Y_trn)

print('accuracy on training data',
    kernel_SVM_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',
    kernel_SVM_model.score(X_tst[features_to_include], Y_tst))

 

【output】

accuracy on training data 0.9176331360946746
accuracy on test data 0.7753726046841731

 

kernel_svm_model_2feat = SVC(kernel='rbf')
kernel_svm_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',
kernel_svm_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',
kernel_svm_model_2feat.score(X_tst[two_features], Y_tst))
 
accuracy on training data 0.8461538461538461
accuracy on test data 0.7792760823278921

 

PlotBoundaries(kernel_svm_model_2feat, X_tst[two_features].values,Y_tst) 
 

f:id:tennisfashionista:20210209015711p:plain

 

 

今回は2通りのSVMを見てきました。

 
ただ、もっと詳しく表の見方について知りたい!全然これだとわからん!
という方は、ぜひ無料体験などを通してプロの先生に聞いてみてくださいね。
分からないところをピンポイントに教えてくれる環境ほど
効率がいいことはありません。
(私自身も無駄だったとは言いたくありませんが、独学で長い年月を遠回りしてきました…)
 
Now or Never!
思い立ったが吉日です。ぜひ見てみてください^^
 

 

 

今後もさらに色んなアルゴリズムを見ていきたいと思います。

最後まで読んで頂きありがとうございました。



分類アルゴリズム~ロジスティック回帰~

こんにちは!EMです^^

 

今日はロジスティック回帰について学んでいこうと思います。

 

ロジスティック回帰(Logistic Regression)

ロジスティック回帰は、カテゴリーデータを分類するための
最も基本的かつ効果的なツールの1つです。

線形回帰では、下の形式の線形方程式を使ってデータをモデル化しました。

f:id:tennisfashionista:20210206021941p:plain
この方程式は、数値の入力属性から数値の予測を出力していきます。
各βiは、出力値を予測する時に、どのくらいそのモデルがXiという重みであるかを
表しています。

 

さて、問題です。

この関数を分類的な予測を出したい時にどのようにすればよいでしょうか?

 

ここでは、ロジスティック回帰と共に、シグモイド曲線を利用します。

f:id:tennisfashionista:20210206023854p:plain



logreg = sk.linear_model.LogisticRegression()
logreg.fit(df[features_to_include],df['Churn'])
logreg.score(df[features_to_include],df['Churn'])
 
【output】
0.8067584836007383
 
注意点としては、仮説を生んだデータを使って仮説を検証するべきではない
という事を忘れないでください。
したがって、データをテストとトレーニングに分割する必要があります。
 
logreg = sk.linear_model.LogisticRegression()
logreg.fit(X_trn[features_to_include],Y_trn)

print('accuracy on training data',logreg.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',logreg.score(X_tst[features_to_include], Y_tst))
 
accuracy on training data 0.8028402366863905
accuracy on test data 0.8058907026259758
 
 
 
このモデルを使用して、未知のデータセットの値を予測できる事を実践してみましょう!
 
pred_probs = logreg.predict_proba(X_tst[features_to_include])
preds = logreg.predict(X_tst[features_to_include])
 
 
前述のように、視覚化として表示していくのは2次元で最も有効的で見て分かりやすいです。
その為、2つの特徴(geature)モデルを選択していきます。
 
logreg2features = sk.linear_model.LogisticRegression()
          .fit(X_trn[two_features],Y_trn)
 
PlotBoundaries(logreg2features,X_tst[two_features].values,Y_tst)
 

f:id:tennisfashionista:20210207000927p:plain



はい、ここまでがロジスティック回帰でした。
今後は今までデータ処理してきたものがどんどん表や視覚的に表示してくので
結果が見えてたのしくなると思います^^
 
 
 
また最後に、最近めちゃくちゃ感動した本があったので紹介します!
 
 
 
 
python実践データ分析100本ノック!!!
実は私、基礎固めから実際の現場で使う応用の間でめちゃくちゃ行き詰まりを感じていたんです。
一つの理由としては、現場のデータは練習のデータよりももっと扱いにくくて
その部分は授業や本で詳しく説明してくれてなかったんです。
 
でもこの本は、現場をはじめから想定して解説してくれています!
「生データはもっと醜い…」という事をうたっている本に出逢えて
これは現場でMLやデータ分析を行う人達にはめちゃくちゃ為になる本だと感じました!!
 
 
という事で、気になる方はぜひオンラインで試し読みして見てくださいね。
 
 
それではまた次回お楽しみに~!