a8 L, o6 u, s& U/ M/ a+ ^1 ], q# v+ t3 R0 m
4 E3 y" G% H+ q7 E0 B7 x0 E
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。 5 @" l5 y( C, s5 N% G" u* S& r' z3 s' N: O& h @' |4 |
: @. G7 r5 G$ V( F1 ?from sklearn import tree 6 E2 C. {! K% h& b. u. r; n+ S2 @ S+ q2 b
1 i: }4 W* X$ ^# J% E# Create tree object % v5 S7 W* B' u2 ymodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini 1 ~5 A3 z3 Z& {+ k$ c8 H2 X: y3 c- t: f- ?) Q: e- S
# model = tree.DecisionTreeRegressor() for regression2 K! w& G5 N4 Z, f: t- } d
, o4 n7 r4 g/ R$ ?4 o# Train the model using the training sets and check score ! H% i G i$ R% X! c# W/ Qmodel.fit(X, y) " C/ B6 k( A& p, V' h- ?8 p2 j8 fmodel.score(X, y)6 F6 ^/ C# _# T, U; \ W) e( ]5 _
( u, n4 s/ h. e8 c5 G: p
#Predict Output8 e: v& L( y: J$ e+ x
predicted= model.predict(x_test), M6 e/ j7 w' y2 ^, V& ? A+ Z
4. 支持向量机(SVM)5 I2 ~/ u" s9 Z2 R4 z) q" B, K
这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。 6 ~+ Q; P# [( m7 m3 X* u4 g) e. X0 K8 y' P- S& a' i4 R3 k
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。# k3 g' P7 i! p; I+ J0 W
) W K* N1 f" q6 G8 b) v
% S* T) t3 P" u X7 L& w
- Q R9 I" U$ y$ l9 K% @6 T7 F在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。 + ]5 y) c- N! t& g9 A e5 X# D. y+ E5 |/ E2 K3 I1 p
#Import Library: W! W) k- d- b9 k: h6 y& O) D
from sklearn import svm b" g7 Y E9 ?' s0 u) W8 _' |: h* h
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset : M1 j' @2 y3 a& \( V# Create SVM classification object 4 n% w; q3 h! A- a, B
/ S' Q, f$ h( \! m/ E! S; s" ?
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail. 5 e+ A7 M& A) k. F' m. E; r7 a1 G" W5 ]0 w) U
# Train the model using the training sets and check score 7 m/ s! |& N, E$ c4 [model.fit(X, y)* k6 ]' m' j1 n* e. R) d
model.score(X, y), t. H/ y' ^% n& [! r p$ B7 u
2 ^8 i0 _/ j, Q, e2 }9 i) ]#Predict Output1 ?3 F" A7 C# g$ }, V) z6 L, o
predicted= model.predict(x_test)4 d! z* I7 ]7 t, G+ h
5. 朴素贝叶斯 / m/ c" W! ~1 O4 D; B5 K这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。' \2 C, `: C/ K4 k
( u+ y/ R, K% W* R5 G( B; M/ b
朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。/ Q, y, Q" T3 e. a6 n
; }1 Z j8 `6 M* i
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下: ( h2 q; c @; T! V4 y/ q0 c5 F. r) E5 L. V" w; J& ~& L
$ R1 P8 u3 c4 a7 Y! q, d F
P(c|x)是已知特征x而分类为c的后验概率。 " A! p Y. ^. s& Z: \ . W3 u/ }+ |' m% ~4 W/ W- r' @P(c)是种类c的先验概率。/ H, x0 N. b: X
6 K1 Z0 n" J( s2 _
P(x|c)是种类c具有特征x的可能性。 0 d" E# Z. Q5 C4 I7 p L; f- M% m# e7 \; T# Z# E `( ?
P(x)是特征x的先验概率。 4 U& m! y4 ~7 U( p 0 F5 `) h) K- `8 w, y ) j( C& ?2 I: X6 A" c, p例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行: 5 S4 P* E/ {/ d/ d0 f: k# W) L5 H& |" i8 K
步骤1:根据已知数据做频率表 / s# I5 B' O) |; y* ] 5 h- a& ~: g/ D步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.# h1 Z8 d" P' S/ @$ Q Q
, E; C0 b. x1 _/ Y
7 B6 u1 A! H& {8 j0 e步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。, h# m4 T: r+ z* ?& i2 U
提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确? ( Q* H/ Q9 d Q' g, ?" Z* S5 |, X+ Q0 s3 H, @* k
我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。: N D" ?% n. c- @+ v
) t; g5 ]2 R) S- v4 r这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。 / ~6 p1 W- }( H9 m) Y* R; {4 U% p2 J, K# }% h6 `
那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。 2 T- X$ K8 t L. E1 r* K, i; e5 w3 x6 x7 o+ e6 S7 j
当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。! H' u4 o0 W! n) z$ h
1 `: [) H" s( M
#Import Library * ]2 E/ r8 _( a6 h/ ]2 Q4 C$ w: Kfrom sklearn.naive_bayes import GaussianNB ) L1 k& u& h9 a. X- ]& c$ [#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset - N e9 F/ x& R" |$ [/ l8 e2 s5 X( B% W0 m
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link% F0 S8 _+ X$ m* W4 a, d0 O5 ]! `
9 N* [" p! p9 W2 [) Y. P f$ _ k, f' e
# Train the model using the training sets and check score ]3 J0 e+ \ x5 W0 ~model.fit(X, y): s+ k6 l/ p5 \: V6 z
8 m0 n/ u8 ^9 u( ~0 L8 N6 n
#Predict Output - j- Y' L2 o1 U6 U0 Fpredicted= model.predict(x_test). P0 R% i% r+ @* A: ^
6.KNN(K-邻近算法) 7 e9 e. o/ ?8 C这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。 + W: d( W6 B" Z& ^2 n# W( x8 p- T3 F
距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。- |/ k9 q; }7 a( J2 i1 Z9 M
# T2 ~1 E$ |6 u/ I7 O( Y' [
4 G# r! j7 H* M: t( A: C2 U e T% U7 Q) f
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。 2 e- I& c/ {1 ?; @$ y! ]! d" o 7 } a x1 `6 P& V) n# ^& k在用KNN前你需要考虑到: 9 n, O. N# b1 ~4 u8 d* V7 e1 n4 |1 o, ~' l) e) H. w
KNN的计算成本很高 * G/ J, O" }- _/ D" R2 X2 j: r% x! H1 n! W# {" w
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。 / |/ e4 r( f* R" k+ Y( } ) U5 @4 h) F4 H/ _9 _) _6 @在进行KNN前预处理数据,例如去除异常值,噪音等。 / B/ {- C7 s/ K$ k3 i. a; h+ m6 M7 w+ f/ x4 R' V$ g6 L& `; E
#Import Library. V1 J z# q( |; {, ]+ i n7 p
from sklearn.neighbors import KNeighborsClassifier " S1 @2 h0 O9 B! m) d! n! [* }/ c8 J) w
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 9 D* ?/ e* ]$ k% C, R7 B. o# Create KNeighbors classifier object model 5 X: k. V9 K, T) r 4 B7 }! y4 Z2 J H: W5 \3 LKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5 7 `5 a7 @' [) \9 B9 `7 S6 |" Q* Z2 N' d! }& A; P) k% m
# Train the model using the training sets and check score0 d- I5 I; }! A" i$ D
model.fit(X, y)2 ~6 Z/ ^: p% m5 W& C) s