' N. ]) W9 j& m; H* d/ e3.决策树 (Decision Tree)5 M6 G1 b& ^* U% [1 g! Z
8 t* s6 S8 P7 Y6 p& L' a2 e: |4.支持向量机(SVM) : s4 N9 `0 n" C5 h) i $ B( k1 _$ |4 |9 F9 M) u5.朴素贝叶斯 (Naive Bayes)* Z R3 k3 ?' k0 S9 B
1 Y* d9 u! m4 F9 j7 f
6.K邻近算法(KNN) 3 u( r1 e6 D. m6 ^8 z& h 8 N9 t; y" v& x; [2 N2 V7.K-均值算法(K-means)5 |9 r: J/ q/ r
# E& i/ n" p: }! E1 x5 ~
8.随机森林 (Random Forest) 4 z' i2 L0 t& A9 }) G; @; ~8 v; ]& p
9.降低维度算法(Dimensionality Reduction Algorithms)6 R- M( }8 X+ h ]0 b. {; W
: k8 R+ N9 N) W2 `5 A
10.Gradient Boost和Adaboost算法 * _- d+ P7 s) f& t2 J一个一个来说: * y6 Z/ e! w2 J+ ?0 ^) h) I8 C1.线性回归 ; ]0 A0 H7 X9 [( {; Y, T * K+ w1 J' I* o( w% X( N0 m U: {线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.; C& c. s6 N' U
5 l2 }, r; `) T
在这个Y=ax+b这个公式里: d- J) Q) k+ I* c |; b( V
2 @; _0 X* }+ o7 ~. y: `
Y=因变量 7 e8 V7 ?1 q2 O" ]( l5 g; Z ! H" v O) M: J2 R2 | a =斜率+ x$ Q7 k. Z7 ] }
- G" o& N* ~1 u8 ] x=自变量 & U0 {) G, f: e- L! X 9 q& ?( k. S' y) R1 \/ h b=截距/ i- e e) M# }
4 b5 n0 K8 ]/ \+ p5 } a和b可以通过最下化因变量误差的平方和得到(最小二乘法) 6 z1 {. }; M/ ~9 d" k" j! n ; A T4 g( i9 U- V1 c* q' x0 Q( I我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。 - q; Q( i- U% x5 G( Z1 v% ^1 D$ z: J. W# j' N6 {
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息. 7 ?6 g) ^( T' E+ G+ d8 w 1 ^# }$ f0 O' d9 z. C* o+ K' ^* g- @6 S, T# F
2 R ^' G! X' J# g" l线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.: O0 K/ i" O2 E" B0 L
" {8 h3 q9 s+ F! ^9 r E M1 C( _拟合多元线性回归的时候,可以利用多项式回归或曲线回归 + l4 y! x1 }" o: Q% L8 @( x' q: B* @& w, c' s7 H# ]2 c
Import Library 2 o7 B3 x1 P% vfrom sklearn import linear_model 4 B- w+ G0 b& w `" `0 Q7 s! D5 |, u2 Z( [" B% v
x_train=input_variables_values_training_datasets . R0 f3 ~" h% }1 L4 v6 I Z7 iy_train=target_variables_values_training_datasets! |2 e" c, S( f# F; l: x
x_test=input_variables_values_test_datasets . j, g9 ]2 Z, w; c ! G! Q) ?7 ?# r; R4 ?& B! l" D# Create linear regression object 0 C/ P2 B6 U: O& Qlinear = linear_model.LinearRegression() ; c* }, k5 \# h( n A7 Q: B. w, ~
# Train the model using the training sets and check score " D Z, @$ s4 T* w3 J8 J- X( Slinear.fit(x_train, y_train) ! X3 k7 o+ `8 {$ Q4 m: Jlinear.score(x_train, y_train) Z7 r1 n4 k: f R6 A( z; }% L% D7 ~0 J) {
#Equation coefficient and Intercept4 w" F" m$ K# i# l9 ]3 h* R
print('Coefficient: \n', linear.coef_) 1 v! ]6 k7 L# p- I# \, }print('Intercept: \n', linear.intercept_) - H! j+ M! Y) K0 \5 j/ J1 A; X9 W" Y0 S1 S# w( A- E6 i
#Predict Output" G# z5 i/ S6 j. B& G. T& I6 x
predicted= linear.predict(x_test) ; C4 b5 @* Q! {2.逻辑回归3 K- u% u+ ~/ @! K1 w" h
逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归! - P- m n) I7 q0 v6 f9 e7 E' v- A4 }; }$ b" ]3 Z3 ~5 }
同样用例子来理解: 3 f# `! x9 G1 V `# X. ~ w' b: c0 Q# T0 w$ H& J, B+ U2 `
假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。 # c$ ]7 o: ^* B! g) V0 P( o' S2 `5 x& n( g% B/ c
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧1 s9 s ^* o0 Z% q
! |: y; N( P% Q9 Z0 b
最终事件的预测变量的线性组合就是:: ~% D5 R( r8 N b8 w; W+ U1 [
' Z* L- C7 y* h) O
( g/ l! N$ B3 e; e9 }odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence0 K* B1 O. b9 ?' H- }2 ~
# i% p9 w" |! n( P
ln(odds) = ln(p/(1-p))) o% P# x6 T+ S- m5 w: n' y8 A
4 y9 S! Y* z: O4 H+ M. [- p2 K
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk 8 }3 b5 G5 M1 H Y* H2 D5 S在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和. ( v8 t5 N1 j0 H% G; R: Z0 p5 P) Q: W- i8 Y+ P
至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法. ! l6 }! Q& Z: l% X . B5 D3 o3 E9 K9 {; s$ ^ & p9 k; S, l" i% E8 j! r2 W7 `7 K* ?* {- ]- H
from sklearn.linear_model import LogisticRegression5 v' S/ R( }! F$ [. h: n
! d2 l. D' W/ E% U, h" W3 Z* A* s
model = LogisticRegression()' ]* U/ y+ Q4 ^7 a6 z2 c$ i5 T; U
( S2 t. ^5 m4 @* X9 Z0 K G ] # Train the model using the training sets and check score) l3 q* b) ]0 l, ?+ l4 S
model.fit(X, y)" B& o! P1 Z/ Q, B0 b+ R( i& H
model.score(X, y)" s% g# ]: p6 v+ m, F! V
1 v* q/ D5 h, r2 Q9 i8 L( c* X
#Equation coefficient and Intercept ) s) h& @# J4 P% `* h" Q print('Coefficient: \n', model.coef_) 9 N( }. f4 Z9 M2 E) p6 x print('Intercept: \n', model.intercept_)( V: X0 Y, N5 Z( W2 n# H+ w
( F! P! ~- }& w; ^
#Predict Output o' r4 R, [+ d. S% B. R
predicted= model.predict(x_test) - \3 g7 L$ X2 i" B5 `+ y逻辑回归的优化: ) Z# w2 t* a7 @1 A. O加入交互项5 b z N% p* R7 t- K/ A
, L9 x5 y' [! e9 m+ i
减少特征变量 8 D A/ x+ G1 c. I" z. G- M" u6 J* f4 l8 G6 g
正则化1 |; Q N d! L5 h: K3 Y
1 ?9 u$ Q/ f$ ^! b 使用非线性模型 & Y! _. {; Y: e. `# O; p6 \! i2 E- D" d7 F' ?) g" G
3.决策树; s. N9 A. U0 n% t
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。3 _; f; ^0 }+ q X) l4 l. R
/ |% a5 C" E0 V* n2 Y, }8 e' \
, }% w3 A" h C% W
1 Z! @' O8 I5 J4 L$ e0 }8 d从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。 ( o% c8 d) k/ y% d0 O8 o# `) V % y X2 v* T& ^# d) G) x9 e8 M : o/ }" K$ h: } ~9 Xfrom sklearn import tree 6 U7 A1 c7 }) @1 h* h w& V& d O8 p7 x9 ^ \( E
5 _+ n4 Z# x9 n+ u
# Create tree object , B& a+ [7 k' i2 q pmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini 1 {4 y: e' m1 y6 w, @% w- K: o' d, R
: H i3 h# M8 L4 R0 o9 i, t
# model = tree.DecisionTreeRegressor() for regression j3 F* ]& B2 q" R% b
4 c, j- \! ?! e! q5 \# Train the model using the training sets and check score 2 |( ]8 c @6 a' d4 s( I. Q7 r. F2 |model.fit(X, y) ! D- B; O2 _6 jmodel.score(X, y) 1 w$ r# T' X2 ^- @& D# J" U7 H- }: L( \5 Z! |4 t9 G6 E; ~- q
#Predict Output % q/ f1 S" }# q4 A: Spredicted= model.predict(x_test) . _7 M1 I2 r, T- m4 u/ ]4 q% m6 p1 a, d4. 支持向量机(SVM) ' H2 u. I" ]9 L+ N2 Y1 }) n q这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。 2 m+ J( ]/ R- I( |- i ) S9 X, h/ X3 u& O b+ R现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。/ B% z2 @5 ^, k% @# Z5 w
- H6 @; x, ]8 J7 \" `' n 7 B# H$ A. S, m, P8 v5 ]6 L, s. p n; D
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。 - {+ _( k: P- T! q. ? 8 K/ H% T. k* B9 X4 m( r' S, k#Import Library & ^& Z& C" \: ?% D, n6 m4 ?1 sfrom sklearn import svm ) m% g5 y- O- M5 z! q4 t. b#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 6 G( J7 ~) O: c8 p% R2 }5 i# Create SVM classification object ; V( e0 G9 ?6 {* S( t. d! N 9 W, q3 O" A4 N: [+ Bmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.% O7 U Z! I$ m# k
6 j, q% K; [0 ^5 c8 p" r# O8 E( Z# Train the model using the training sets and check score 7 p: _2 ~9 q# G5 x$ p- Zmodel.fit(X, y) / K! O; L+ ~- v+ xmodel.score(X, y) ( m! y) f/ z; x2 Q, Z" s9 w4 ~* n5 E( D) K3 {# U
#Predict Output/ h/ f0 h4 F5 X" D
predicted= model.predict(x_test)% ]2 ?; i+ s8 p! @( s O7 A
5. 朴素贝叶斯$ F6 h0 b9 i: h* F* k$ I; x
这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。 * M7 J* N. C$ E! l: _4 r: V1 Z: \+ r) g3 G
朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。 ( k: l) \$ T' K& @' ^ 0 g3 _' {2 x( f. D, {贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:+ g. Z$ c. @! P, n8 I+ E$ B
k( x3 p. s6 z" P7 l$ [% k
$ o9 W9 H, n$ V$ }
P(c|x)是已知特征x而分类为c的后验概率。+ [6 [8 i, Q: K2 D; _8 B
/ p" A0 V# k9 Y. K+ ^8 V2 nP(c)是种类c的先验概率。6 j3 `( C5 o; e0 P
" g" c' A/ c& b: q1 F# C0 kP(x|c)是种类c具有特征x的可能性。& a/ e1 {) r9 {6 ?4 L. o