* `+ T# W3 h8 h4 S0 o0 v* K Y=因变量0 {* R" R3 x/ ?: V# z+ h
* z0 l' @* X7 }6 Q; M; y" Q$ S2 U
a =斜率 4 \1 e: S% D$ X2 \5 i5 e) t4 V' l! @" ]0 Z5 S
x=自变量 + K8 O$ Y0 L0 A2 f* a8 m 9 w% L4 z2 ?6 s8 m b=截距 . M. [7 I n% J2 V, A # C! M9 f( | H9 Y: `2 y a和b可以通过最下化因变量误差的平方和得到(最小二乘法)9 ^* h0 ~' U$ O% i, p
: w! e5 |7 l; Q3 Z) c# `! C4 b
我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。: e: G: D2 y, s: z0 e9 Z0 l
, g. o% a k! q( ~3 g% ], {& e9 j给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息. , j% ^9 \2 {& _" ]3 A6 u. N$ P% c- M0 |# e4 \. Y( ^& Q; {" q5 S1 @# i
! R6 ^* D1 f7 R' u2 Y5 x6 R, i/ m4 P( o! X! u v$ g* o8 H
线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量. + {4 Z8 C: o7 ~0 Z. U. H r+ P/ m8 Q5 C7 ~3 _; n L; X: e5 m; h
拟合多元线性回归的时候,可以利用多项式回归或曲线回归& h) ?. ]+ w( L2 X
( Y& a; Y) {* r! P1 _# G( F& d& d% d% y- l+ }. L! F/ A
( q/ ~; |' O, I& {
from sklearn.linear_model import LogisticRegression . |+ Q1 E% w' F9 ?0 t; | H+ q, [6 R" l. F6 o) U/ G, V$ G) q
model = LogisticRegression() ' |- c, E6 X5 f6 U( [7 K 3 w0 g, R, C( W% X1 z6 v* _. B # Train the model using the training sets and check score& D& H8 v0 |7 D4 w, ?: Y' i
model.fit(X, y) 0 f+ W) a8 B3 z9 Y+ g }! H: ^ model.score(X, y)# t! M3 |2 h" T, q$ V7 |
! y4 v8 m* }# B1 H, M$ a #Equation coefficient and Intercept ! ~1 }- O) h$ U8 e' f* @ print('Coefficient: \n', model.coef_) " U* n W/ N9 Z: M- i5 m' @6 H print('Intercept: \n', model.intercept_) 2 `% }# b; n: h / b# T# v' `3 M/ L1 P( E #Predict Output * F' w2 k4 f2 d predicted= model.predict(x_test) . ~- Z, e7 g5 ]# M( N! r逻辑回归的优化:2 L! C- H7 c4 [' Q8 c
加入交互项: W$ P* `& D9 O' X+ c, {7 h Z9 v
+ `6 O9 h G7 w( h6 d7 L) w
减少特征变量+ ]8 `: P- ]& T" ~+ m
" M* \- {+ u" N& ?5 K3 R 正则化 / \0 X& d7 K# F: c! t& j8 U: N , J; ]4 {4 t- b& E: `' [2 E, ~' ? 使用非线性模型 3 x3 E) ~6 \1 y L# v " E" F+ {3 b! x. T3.决策树5 U: R0 S+ R! \
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。 ! g: T" m; J" ]+ J3 L, Z1 }, ^/ O# S8 |
8 h; |& E O+ f8 U/ c. x3 G3 @- B
: ?' t7 ] ~% A4 o6 u/ J7 W从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。0 ]8 z% j2 [& M
$ i! I) r# ?7 A/ Z& E/ r
& K4 c% O/ f' w( i: gfrom sklearn import tree 6 u# m; _! o2 _- H4 T' t& @% i1 q+ L9 Z4 j8 U8 [: H- q' h
& P" F& _' |$ y6 B( A- z! M, C# Create tree object 1 D: ^- A3 m/ Z2 i
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini 4 f# s/ A3 G4 d
* P O% r+ w5 o! F8 j
# model = tree.DecisionTreeRegressor() for regression6 y' w5 W; G. K
' q$ ], w1 k1 o! ?
# Train the model using the training sets and check score 5 \4 Y- y( o zmodel.fit(X, y) , p7 t- s3 N8 jmodel.score(X, y) , V' J; K6 Z- G4 e p9 }( j " ?% d9 I, I5 V) K2 q#Predict Output / n3 F+ `! a I" u2 }6 Zpredicted= model.predict(x_test)+ ~9 E# D. d! {' x7 \' j$ C" o. z
4. 支持向量机(SVM) # Y+ ]& N# H- Z7 ~这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。 ) j7 w: v5 Z$ A! W; x8 @7 d& t- w ; ~" F9 n, {: [! _7 ~/ K# v9 n现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。$ G: ^$ q" p- G3 v1 G- s
2 u5 ?. c% x/ D5 q3 R* t) U5 {: p% S, i. J$ ~9 y8 I
' z! J* M! U; F
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。# D1 g0 R4 N+ e% j: k5 c. m; V" i
: B- s, l( L8 M5 @3 N
#Import Library, l% `5 D" B% S/ L2 B
from sklearn import svm " F, _5 [: r, l* T! e#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset" G+ M5 o2 ^9 b w- O
# Create SVM classification object ' } R$ T/ L: ?8 _3 N z/ G l2 M/ j3 _, x
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail. 6 Z! r1 y% f7 }) Q + f, C- T+ j( N1 @/ K. t# Train the model using the training sets and check score0 l. Y- @7 M- i: T- P8 x
model.fit(X, y) . }/ g* b7 n5 U# J+ h: jmodel.score(X, y)7 c1 d/ o) a' q7 R) [; f" Q0 F6 N
" j6 _- z/ b- m, J) l Y) q#Predict Output * `6 o5 P" F( Vpredicted= model.predict(x_test)2 k. Y9 ~; N/ N/ R; V" ?8 H
5. 朴素贝叶斯 * U7 Q% g, z$ F6 C6 J这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。 % r3 p9 V! }: y' ~4 P4 M# H 8 \* q1 ]; ~) h; ?( d朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。% w" H( G, n3 q8 _4 R% Y
/ H% A" f# u3 A* i2 F6 {
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:! y1 F" J2 d, Q/ v
4 h3 g: R) J; g
+ }) y/ I! k1 Y5 X6 v) `# v
P(c|x)是已知特征x而分类为c的后验概率。 7 P' n% M# }% K3 u: n. _9 ~( y& c( b( @9 z4 g3 D& `* k" z8 u. _
P(c)是种类c的先验概率。0 }, ^% o0 G; d/ a
9 x1 y) f$ ]4 X1 ?+ i0 L. e; b- O3 t
P(x|c)是种类c具有特征x的可能性。, i) d. z& |4 {
4 }9 q% o8 c* S% e4 L' U/ k# t' L3 a
P(x)是特征x的先验概率。 ~5 d" H" B' k
" y# y8 S; T9 I, f8 ~0 r+ x R7 ]- y' S* R. a0 z$ B& p0 R
例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:4 k, R3 e. I2 L! q" U1 v
* ?5 t3 f8 l" b) O$ }
步骤1:根据已知数据做频率表 + T: L# t6 A0 D; }+ l, Z0 q$ a9 E! N" O. F
步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64. # Q3 t' B# c. K5 l! o! u' U% S( j: ]9 y, b& {1 j/ U, V% f% p
7 R7 k# K( o/ a, w; r$ |# L步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。' M* t7 Q* t0 }. V* X- g. L
提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确? 5 t4 @9 f$ w- m7 X( y' u# p% _0 z
我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。0 H5 I1 j& Y& t