3 n6 u* c/ f" T2 |假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。. \' T8 m4 T, R( k
8 w; w, {: i% k7 l4 x# v; v$ `' a
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧 ' h' B6 m0 H) j2 w* K& X 3 x$ X# N. D8 S; s最终事件的预测变量的线性组合就是:+ G" u& I" G" s' ? k
" G4 B) Q6 I7 X1 E" | [1 o 2 n" E4 S" S8 iodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence# I* ?8 E- \# k# {- c
8 q- N% y9 W0 x# v/ y6 \
ln(odds) = ln(p/(1-p)) ( @1 p" X( P' H* a, ` . j! A' o# C' J2 X% glogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk ; U$ `- u, n, r8 J# ?. l. ]) a6 r在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和., T- U+ i1 O& C( Q
& n, f8 V/ R! Q0 Z$ W
至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法. 7 e6 N$ S" P' N2 l% _8 g. h ( y( y9 ^+ _0 t7 t & z% `0 x8 Y: _$ j4 o) Z' F4 W1 I9 Z! [3 A
from sklearn.linear_model import LogisticRegression % W7 }; H! Z- ~, r + H3 N7 u5 R& D _" \6 q4 h model = LogisticRegression() ) p# f+ D$ Y9 J' I" S) J7 U: I# H# Q& J: j* a5 T7 ?9 x
# Train the model using the training sets and check score- C/ W4 L# C4 C) Z$ f, R9 t& ~/ J& D
model.fit(X, y) 9 i3 Z3 ]9 ?& ^ G) |8 A! d3 W3 L model.score(X, y) : v2 E, y) T4 M+ D! v. M : U+ s) c6 b7 T# o Q; Y9 P #Equation coefficient and Intercept* { ]0 f* d7 D t8 A0 ?3 T( |
print('Coefficient: \n', model.coef_)7 _1 F0 o$ E$ O* D% d5 @
print('Intercept: \n', model.intercept_)8 w% e4 m% Y. e& x+ {4 O/ P
. h# C: ^) X/ b- w, q8 W# {/ K
#Predict Output: ?$ u% N. B1 ^) S& V% s3 c, Y
predicted= model.predict(x_test)0 Y. l6 \7 W9 x# j
逻辑回归的优化: 9 D9 d3 {! f: r: O: P; a/ Y) u加入交互项 a- k8 X, h1 x# l5 b' ~! j 4 w8 c9 t8 V; @3 P4 R- W8 A 减少特征变量. u5 A& J5 \( ~3 I# T4 r" Z
% q Z& K+ ]- r. k7 }( M 正则化 + F/ f' }/ v$ Z b% n. M% S- M3 v1 |
使用非线性模型; j7 H& b5 }8 W |/ j& H$ ?2 q& p
( S3 A V" r& R
3.决策树 , d3 m2 G, U3 x- W这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。" H7 F; [5 \6 z; ?8 V2 {+ |
& G" z, x0 P4 Y% {" `0 Q' F" g! s " R' d" \8 j: U$ D - V4 z. f" e- ^从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。 `0 J. @' j/ K
# O( e. h) \- c+ t* i s/ }4 Z
" y! i0 L; K* M5 a W" `3 Efrom sklearn import tree ( l- }- \6 C9 h# _ ' [* ^' Q3 N1 N! f; [- d6 R5 O; |+ a& f; i$ n( O& m3 C( ]
# Create tree object ' P6 T- O+ O! }6 r; _
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini ) C/ p( @! \. c! x+ ]* G7 v O
$ F y$ g( C* d4 ^
# model = tree.DecisionTreeRegressor() for regression/ T7 G) |( `% t. {2 s+ E& `
+ r! y2 N: B+ e# C, p$ C4 Z
# Train the model using the training sets and check score + b; T0 L3 ]. c+ N8 d6 ^% p% Dmodel.fit(X, y)0 h$ U9 ^4 F$ x' K
model.score(X, y)) [ ]" s8 t, ~ H& I9 V5 F
4 Z* @* K* X( M7 R9 V#Predict Output+ P# S+ o# x. Z1 P% C3 s
predicted= model.predict(x_test) t( Z# K6 U2 {3 C# B4. 支持向量机(SVM) 3 ?) g5 F1 y3 \8 s. {6 C这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。/ J& ^, N# o. x; o6 p
; S+ B. ]9 l8 a, Q3 P# r现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。 $ `2 i7 f3 `1 e: G r T3 N& |3 Z6 ]& T S
5 _( ?, \) B) C ' `; S) q \- K) c3 M& s在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。- A5 e) M/ _' l' A
& V. {2 S8 u8 M#Import Library* p9 a9 b6 K" x5 b- W+ ^
from sklearn import svm 5 C: k# ?" ^3 V( |2 L5 F* \#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset& l: F; Y1 o6 R( j
# Create SVM classification object # m: ?1 ]/ L. r* s- r/ |6 Z+ V6 k 0 Y9 v7 d: ^' Y, @: r" rmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.% e$ A D2 I1 g* n$ f
) q; \6 i S! }/ W! t$ g6 x% I
# Train the model using the training sets and check score/ l. V- K% q* H7 W$ r3 Z
model.fit(X, y)3 N. ?1 u; {7 E/ J# o
model.score(X, y) . |' F5 ~' t) K - q8 z- C5 U6 c o1 v. b) p: p#Predict Output : L. H ^# p6 H7 rpredicted= model.predict(x_test) 9 w2 ^4 g* M7 I/ {0 w5. 朴素贝叶斯 ' Z& o0 Q% c6 a- I1 q这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。+ N1 J3 U; F6 x
y6 Y; {6 n% l$ G6 J' A* x C5 B朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。! ], S4 K! K$ z
& k% x t2 y# }6 d! h: ^
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:) r* [3 |6 I- G! _1 @+ g' e
' R% u9 f) h$ {; G; o
% G% l2 ?7 [$ lP(c|x)是已知特征x而分类为c的后验概率。 # E9 w2 [2 |: I" N * `9 f, m- p$ y8 u4 x, U; LP(c)是种类c的先验概率。" f. L) W' ?, g% n. Q. m) @" C
8 {4 Y: p' I% r3 MP(x|c)是种类c具有特征x的可能性。, v8 q! s) N% W. m+ b5 t
0 g Z! }9 p: \1 t- `
P(x)是特征x的先验概率。 6 i; d, |: i3 c 7 S; k4 O: n3 P7 H/ C( L! F8 F 5 \+ R' t0 ?& ^+ j" H' P例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:( h) P# p/ m( u# [ A5 ~" ?
7 A& p+ y, p4 y* ^步骤1:根据已知数据做频率表$ A* w5 N, e) e q" v/ w
* _0 g4 I3 |8 h5 G6 A D$ V
步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64. ! \ L# C* |" H* r* _6 N4 u% \5 G7 t( l7 |% N
4 {) f/ {$ W; h
步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。% H2 F+ T0 s6 I+ d) l6 H
提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?: M# q! U2 @6 e$ C
& @4 S. w' t2 A7 i V
我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。 4 A1 D. i( O- D6 C. t( t. i & \2 ~9 x9 X6 K这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。 - J$ f* p0 Y3 @) ~ ; |- s, m: k! Q8 t+ B6 D6 o那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。& J7 l0 _1 \3 S& r0 J! o
' H% F" Y4 |, Z4 \3 A3 J$ {, C当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。 $ p! m- U2 W0 a$ D( x3 Q* Q k ; s3 ^" n ^+ u& y#Import Library$ f1 M# H1 S! S+ w, n; j3 g
from sklearn.naive_bayes import GaussianNB8 f Y$ V( P7 t. a" b/ {( E1 x
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 U+ z8 x3 i+ x
6 V! u& H+ Z0 ~! T, p; W/ a* ]' o3 C
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link / ^( F4 W( b; @( K1 X5 w( R- e2 g0 _5 x2 D- G% V% x: X6 _- U
# Train the model using the training sets and check score% h6 q* s1 c5 L1 l) T- P2 W
model.fit(X, y) 6 K' i4 S+ G" k6 g( Z/ H' ?; M5 Y4 L2 Z! f5 H& n
#Predict Output 5 S2 d1 G1 B) F; rpredicted= model.predict(x_test) ( B/ @, P6 s" \" a! x. C6.KNN(K-邻近算法) " R/ T7 r/ `, Z) h这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。 J3 H- C2 V/ b: {7 x
, z2 U6 s3 t8 r+ y7 F距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。$ e) }& J- G9 t" Y# e! T
1 F' v0 X$ P+ Z8 j5 p
/ c: Y8 g: F- t/ j7 g8 j# I在用KNN前你需要考虑到: : J" r5 k( T V1 U9 ~" f3 ^3 p, T. G
KNN的计算成本很高+ ^5 c0 P5 d5 [* g" O0 f' y8 A/ _
: V `. Q6 B3 T2 X8 n2 l7 E所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。$ i2 {/ f C0 ^
# k. I$ ~ J1 p在进行KNN前预处理数据,例如去除异常值,噪音等。 9 U' X- U6 @4 [2 N# i+ Y0 J; y) _3 E+ |
#Import Library; r& y' Z% x& @. U
from sklearn.neighbors import KNeighborsClassifier) v! }) A7 b" z) O ]
# m* U0 e7 X' u# q
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset v/ E. o' n r/ T+ \9 S. W! u
# Create KNeighbors classifier object model 9 i0 g* t1 B- z
5 z V0 C1 w% m1 a0 r& L# i, S& @
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5 " j6 b% T ~# q8 }9 Q# U: Q. N6 z( a& g# Y( E; A8 o9 a$ x
# Train the model using the training sets and check score, P8 J; V, m4 H6 m* g) x
model.fit(X, y) 5 \/ J p7 Y& D* I8 a, e: d) x" I; B- A5 U. j$ n
#Predict Output . x6 Z3 R/ \. ]predicted= model.predict(x_test)5 ^! V: R9 b2 Z7 @) M+ W* L
7. K均值算法(K-Means)" | T7 Y) `) D! B! W, W
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。; P4 d; i9 U* u: ]9 `
* s4 q2 i Z, \还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量! s" s/ Y$ |0 U8 J' ]' P! A: O7 i3 d
3 T$ h# {& C, V. y # T" N. X2 [! S) ~怎样确定K的值: ! }- V8 s3 e. h$ R 1 t1 t3 Y. t3 g: J如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。9 c4 U7 L% A/ x! ~& f; f' _8 V/ B