8 }3 G& }7 j0 P3 fP(x)是特征x的先验概率。 7 P, j+ B1 l/ w 5 R% W% C" V( Y4 M( ~2 O* R 6 R3 h i* U! A0 ^! c9 t例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行: ( l x* k+ }. p0 w( G) ]( J: x 0 R& `0 W) y t8 j/ o0 b y步骤1:根据已知数据做频率表 4 ]: Y. r' q. n+ _" t! q7 |# K/ z) X, r& T9 j. O
步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.& d% o1 |- E) P p
3 g" @ g7 [* ^! e2 h! C
% g+ N* t, V/ V$ ]
步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。+ R3 | |& ]+ \- N4 `4 |& s7 e j# p. r
提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确? ; D+ ^ \% R$ K& n ; U4 u5 k3 D8 { u) g l我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。/ v* a6 B. H1 M4 o% Z
; R1 i* \4 M+ t# W' s
这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。 # J# e% t' _& `# v 0 y6 B# ~4 B, W- Q那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。 ) A( R$ \8 L* j0 p ( m4 n/ T& P. c% F$ Y; G: k当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。) c9 F M& u) e9 H8 W
8 f; t* I3 I1 f3 M+ v+ @$ Q1 j9 q#Import Library % `) h+ S K: ^) d1 k. }from sklearn.naive_bayes import GaussianNB! u$ ]) j& o" z8 o
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset% s4 U. V3 I8 Z9 Y0 t4 J" n2 R
4 G2 ]6 X w& r4 j# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link1 P2 G n7 P0 b. d: X% ]
. R! B3 p2 W% z& H; n
# Train the model using the training sets and check score " I+ }: S' o! t! M0 Rmodel.fit(X, y). l1 P% m; p( k8 m' ~* a
2 x7 P' |; G7 L% V. P#Predict Output 9 D) E- k! D7 cpredicted= model.predict(x_test) 8 ?, W- p/ l: v }& }5 a6.KNN(K-邻近算法)- A0 y' t: x+ G. w
这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。 - a* W+ K& M' V: Z. O8 A; X; [ G- z1 C( ]4 j: t }
距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。- i7 i, L* \; c8 b
4 w1 v' d% u6 i2 [: J- {. D9 y0 [" o ) I! L: h- e; j `. C+ i! y' g; J' q% J! \; t9 d$ l4 Z
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。 8 [( K- x) A- o9 Z/ _1 }; Q5 F5 f. M" q0 E0 U, p
在用KNN前你需要考虑到:' a ~3 C& W5 t7 z0 {
- L1 B. m: ^2 J; W2 AKNN的计算成本很高 q0 t0 ?4 j* x2 |% e - E& j9 ]+ } P' V: f: M所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。" J' K/ j! X9 h: v
% C P4 {; }$ e" G+ G# G在进行KNN前预处理数据,例如去除异常值,噪音等。 : m. G* N+ N7 _6 X + D# J. ]' L! d. w1 l- v#Import Library8 R- X$ h& {% |# T& [% j p
from sklearn.neighbors import KNeighborsClassifier ) n. Q% F4 \! J5 M0 a$ E6 M " t) i. s0 _: W6 q' j#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# |( x% P# w) ?/ A2 [/ o
# Create KNeighbors classifier object model 9 z: _8 e e/ d% d2 p
. }+ |( I8 ^4 p7 q" i4 {KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 59 [& W4 }: z. u6 t' H
- F$ \( n( [9 x- Q# Train the model using the training sets and check score% |3 A8 W b: r/ V
model.fit(X, y)1 @3 v' N8 j3 {$ a
% z8 r5 g/ F2 y#Predict Output' C) m @) O& I
predicted= model.predict(x_test)1 L0 E. H0 `$ k; |; n. j
7. K均值算法(K-Means), _, Z: M2 W' s4 M' q( E7 h
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。 6 \. n4 Q9 o/ U2 ~5 O , [! T! `2 A# [* @9 d, D+ g* E还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!# l1 S/ s O0 ~" f" b3 ?1 i
- ?+ {% R4 U5 t
+ E8 z* V5 a1 I# K3 T) k0 p: Z" |% i. i, G9 v) c3 n7 n* g5 ? V
从每个集群中选取K个数据点作为质心(centroids)。 & u2 c% ^; D S) G) g/ w0 k7 _" b, T. q/ i( e* _% I
将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。 9 g& W/ P. j Z3 P* ^. W" n2 s7 v, y( h: Y) F! Z5 E
找出新集群的质心,这样就有了新的质心。2 v4 ?$ T; p1 i# R/ p/ t4 @0 |
8 L( j& E6 `/ J! V
重复2和3,直到结果收敛,即不再有新的质心出现。 3 a, ^, H/ r! c; g2 |) D1 \2 Z j! _( n4 u4 f; B
" X1 J: Y8 |# _* y- V2 y' ~; u- E
怎样确定K的值: * l' z8 K' T- J; y8 j- e% n( @; T7 R4 g& s1 d+ y
如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。" ~ r6 j& X3 _% j9 _. N; w( n; k
8 O% g: l$ ~0 p- t. t+ q' l
我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。 4 D" B- E( C# K- I; f+ a& k1 u# Y, D u' c5 o8 t3 m
5 i. F/ H' T. S7 _$ n, ]' a. A# M
#Import Library ( y4 ?7 Q, @% t& E) K, v, Ffrom sklearn.cluster import KMeans6 Q7 |# S; w8 k1 Y$ d
" O; N/ W2 Z1 @; ?
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset 7 `3 E6 M( ]% o+ ~4 b& B# Create KNeighbors classifier object model $ h) B9 ?. ^7 s% ~ j/ G
k_means = KMeans(n_clusters=3, random_state=0) 8 U3 Q& _7 j7 W, a; a( \# c+ a, J. P* C9 T. |
# Train the model using the training sets and check score 2 Y$ t, ]" D7 i& g0 \0 rmodel.fit(X) ; W* w4 f1 Q, c5 X1 X / _; g' b3 I, p" W* p8 b5 E4 I#Predict Output a$ Y( n5 N1 [& d9 n% S1 z$ G
predicted= model.predict(x_test)" u& [# }8 `: y% M' _1 p
8.随机森林% L: ~# v% K' {# i6 K o( a& U
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。 ) t( e& O; G% K) `# N6 S9 Q $ j$ _4 C5 ^2 e) v: f' X% q8 A怎样生成决策树: , q/ _' g+ u0 b) ]& U ! a' u7 l, ?) I9 g' i3 G$ s如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。 # U9 j; I* m$ j: s" [8 c4 c4 s6 P1 N4 R& E
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。3 C" ^5 d- Y9 N) |, r1 P( z
' j# R# e. U3 M% }; @! k
每个决策树都最大程度上进行分割,没有剪枝。9 f) y- E1 A% x4 E& A3 _& j
8 U' X$ J1 J* q% c#Import Library - k2 s0 B8 R" k+ n" lfrom sklearn.ensemble import RandomForestClassifier/ a4 Q( M% O+ @8 g7 ~4 i: ^
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 0 f: |$ U, \' Z* Y9 q 8 E) V9 G/ G% Q5 S1 l9 [# Create Random Forest object : z; H; a. } a+ w9 W$ bmodel= RandomForestClassifier() - ], e5 S2 L) j, ^' ^) H, t L7 B0 R9 ^ n1 P
# Train the model using the training sets and check score5 i$ u- S% V3 U2 R6 q5 E# w
model.fit(X, y)- G q+ _# O7 C7 ~8 U7 y$ D
7 ` n, i3 ^, L2 F: |( \#Predict Output 3 c8 l- y- L% ]" K- G: F! g4 l/ vpredicted= model.predict(x_test)1 J' x. V$ T7 y0 w
9.降维算法(Dimensionality Reduction Algorithms) 4 |+ y3 Z Z. L; s# y' y. m2 z5 y4 j在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。 ?7 \: ^( C. F+ |* ~$ |2 a! ~4 Z1 ]
例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。* b" Z# U- c5 s) A0 x" k
& U* E" _. ?- i5 ]& m0 @
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。* m( ?2 k [! ~) i
1 K. T; b7 r& `4 m
6 h7 F" o# A& ^/ K#Import Library 8 N; j7 N$ T4 o- G9 u- nfrom sklearn import decomposition / ^& S7 F. z( M8 @#Assumed you have training and test data set as train and test2 t1 A+ m2 f) A- v$ v6 K
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) , { B% B# ^( l1 F: T) b* D# For Factor analysis p- J9 \6 V" g4 T X
#fa= decomposition.FactorAnalysis()3 l3 v' C% f o7 b" |
# Reduced the dimension of training dataset using PCA 7 c: r3 j* K8 h7 O, J, a- q; n# I2 ?( O
train_reduced = pca.fit_transform(train)% | H f+ s) p
0 c' N$ g9 B9 E; L% w#Reduced the dimension of test dataset . |- ^1 U: r# v: ctest_reduced = pca.transform(test) , d- U" i' e4 l6 M4 S/ j* A8 G$ y: E10.Gradient Boosing 和 AdaBoost3 T# n% w- g/ G8 |9 A( W9 A
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。/ @; R. |1 `9 T5 W
' `) g" R! P; R5 w5 D7 z#Import Library ! e" B8 }: ~+ U/ S' T7 k' cfrom sklearn.ensemble import GradientBoostingClassifier 1 ~. d9 i7 Q+ R6 I8 n2 P( Z#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# y7 t; O* `8 v# a
# Create Gradient Boosting Classifier object " @. F( @# s2 y4 d) P( z! lmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0) % s, x( ~2 p- d4 q0 m8 c# U 4 y! O% X0 z$ i( }0 g# Train the model using the training sets and check score ~+ {# D1 q9 d+ _; i1 G! V
model.fit(X, y)8 A! w3 B3 c, g q+ b. S3 p
#Predict Output0 t% @. d2 p9 c. m$ _ c
predicted= model.predict(x_test)- T* k! {+ W7 l
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。. h6 |8 Y8 L; I" x: k% m/ u* M