/ i' u& C* l& ~6 T8 t6 n在这个Y=ax+b这个公式里:- T2 T& P' T* Q
+ ^, ?* r s4 c3 |5 Q7 j) q
Y=因变量" t" y8 {$ L2 x( q$ O& e4 j) O, S
2 w& k' J0 q2 z* m- X9 K9 l
a =斜率; l0 o) t" M( C7 H
, j4 }" r0 L0 f. a
x=自变量1 m& K, Z- k( t) `& F
* l7 c% b% f2 q9 R8 i
b=截距 # S8 n6 d7 w) f, c3 s& r* X7 p" I . U6 t8 `( I3 Y4 F" ~ a和b可以通过最下化因变量误差的平方和得到(最小二乘法) 0 w( i: f, ]- }! k2 h6 i" s * S4 D1 r0 ?9 C& K3 v' m1 O, P我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。 4 e" T7 T, p2 G: j$ _: k+ k+ A/ E% k: {* M6 D$ _
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.9 M4 |0 T5 s7 H. {8 b. x5 y6 @
5 g' x/ X& L' ?: t$ ]6 F# a* P5 t- t' D
/ s/ S* G! ^- `4 c* B3 p! p线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量. Z4 k- B8 h; } Y; U7 ?( `$ Q' M9 Q# n9 M( g
拟合多元线性回归的时候,可以利用多项式回归或曲线回归" Y9 u( V" v! c4 U! {+ }" a
$ A1 h. ?* n0 e- b" n
Import Library; q5 K5 Y5 ?+ h% q
from sklearn import linear_model @1 p" |3 ?. ~' [& }, j2 j ! |6 z9 ~6 Y5 j7 s1 x1 O( qx_train=input_variables_values_training_datasets ! J/ q; \& R+ a+ u4 A [, iy_train=target_variables_values_training_datasets5 C5 B2 J( l# @9 O; ]2 Q
x_test=input_variables_values_test_datasets ?/ _. M' M" p6 e: ~ + I: c: M2 f' }( Y% Z# Create linear regression object " O8 T$ Y* _ B& Q3 ~linear = linear_model.LinearRegression() 5 ?1 `% Z5 M6 j; A2 e T) M 4 x4 x8 x8 _' T! i, Z& l) |, h% {# Train the model using the training sets and check score 6 c- {$ e# X$ E1 m6 [linear.fit(x_train, y_train) 3 s3 e& q: d' P% u. Slinear.score(x_train, y_train)+ A( y1 }; p! V9 ~8 @) |
& t* ^# h4 K" b: @6 Y
#Equation coefficient and Intercept* [. c+ \* q0 | Z( z( Q- g8 ~# }8 m
print('Coefficient: \n', linear.coef_)( D- A2 j6 P* Y
print('Intercept: \n', linear.intercept_) * I: {$ P! y+ d8 R1 b% R: n* ~: V/ t # l# k, i. a& c+ H8 |#Predict Output; l5 o6 w& {0 r/ U8 z8 b d
predicted= linear.predict(x_test) & x8 i$ N* X( z* l2 y6 d2.逻辑回归 8 N: X& x& O5 }9 F b- [: v逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!* O8 N1 \* `- s! l* K1 {6 P( C$ T# D
' v/ k7 e( Q# a: P同样用例子来理解: / B4 E7 W# f8 ^1 c7 g 1 L, ^. C" p) {. f) \1 B w假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。" y! J$ f. L# l; H+ i
1 A! I0 x- Q8 L& z+ j: n, k% }+ H& a
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧8 E$ ^9 _! N# N$ ^
! v& l) R! R2 p* o
最终事件的预测变量的线性组合就是: ! F. W5 P2 v8 Y6 G& z( Z/ ~- i" P+ d5 u& X r) _9 A/ h4 {: \! \
- X4 t$ f9 X8 B1 g1 T$ Z9 z Yodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence 0 b6 b$ R: m" W - M/ Q! N9 H- Mln(odds) = ln(p/(1-p)) 3 s8 m/ V3 X$ @5 z. }: S + [% u( C% B8 b0 h8 g, B. llogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk ! R3 t7 t( M1 u! _/ C( `+ I5 j在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.! d/ y1 w( b8 {- O- x3 E
2 w; S) O$ R5 N4 n
至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.6 r1 F, r4 M7 ]; @ k
1 U1 y& N! ]1 G& I N* f# `# j, D5 b N! |
# ?4 J @- i: Z, w& k from sklearn.linear_model import LogisticRegression4 `1 V; A2 N j) w
1 o9 [7 d2 M( i
model = LogisticRegression() - d& J! e7 p1 Z% C( f4 a K8 K' l' u
# Train the model using the training sets and check score 7 h, k) N$ M% ]! Q4 [8 F# x7 N4 d model.fit(X, y) 4 n) C( j; ~+ R: j% g \ model.score(X, y)# m. }" x/ a) b* P1 _0 r
4 a5 n/ ~+ K3 }) u
#Equation coefficient and Intercept " I! m0 D! r& w( _8 i( h, d/ q print('Coefficient: \n', model.coef_) - f4 F* c! Y/ w" n. o0 P print('Intercept: \n', model.intercept_)- T2 `. c7 m8 i# c( k" H7 Q7 B
+ K: `0 U0 c- `9 C7 v, w/ z/ F0 z
#Predict Output 3 c k# L4 X& G# Z7 m- c9 L1 @1 L4 @ predicted= model.predict(x_test)1 R& v/ B4 v: I/ H, v4 Y# m/ Q
逻辑回归的优化:; ~: |# v+ I# E* G" ~
加入交互项 ; Q6 p d* y6 E# y7 v0 i / ?% t* h' Y7 O$ i) i( i0 c% t) x 减少特征变量 - E; @! i+ C) U" ~6 @5 }- B; U4 m" d8 p* C% `+ t
正则化 , h3 Y+ ~1 B5 B1 {$ D3 c( E 0 o" @' c7 s2 l+ X 使用非线性模型9 Y- Q5 o' N2 ]& a! h9 a
6 [" p# P9 R/ c$ l1 J3.决策树9 [# ^) ?8 Q* V' o6 u" O e; D
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。 & ~6 O" ]( L! }" P8 N" ?& Z/ ~" C8 \1 B' G& k$ M
$ @& Z6 w6 Y" D% H
+ g3 c0 j5 P' E* f
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。5 B) |* A- I: Y/ o
5 d* i' P% ]/ C9 C9 c
+ }* z" d7 K& O* ?% M
from sklearn import tree T9 m8 B% a- ~1 {$ ~+ `) }
- v9 \0 L$ O- r p( G E
5 s5 ~1 g2 d0 J4 |) Q; g0 ?+ ?
# Create tree object . k g& P N* O: Bmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini , q, v6 Z, E) c9 x+ B
- y1 R/ U) Q, ^/ q# H/ ~# Train the model using the training sets and check score 0 g! I0 q! `: D7 Imodel.fit(X, y)/ k8 h: a! ^0 A( a: C) t
model.score(X, y) [: M, ]8 T: c. f2 ~
" s+ e& f* z- q$ J) f3 B4 |" j现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。- A% C' e9 U" s, ^4 g1 g* U2 M
8 p9 L5 v: }1 C$ M- ` ; P" p7 t* v. s7 t' u2 r' t( e' t' G& [1 L( `
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。# ^$ Y. G! F( s: [) F4 j
& `& q* ]& f3 ~: J5 ]2 W3 i#Import Library5 u! h& Z( |! S6 g: H9 q) h" J* t
from sklearn import svm ) p& |4 n1 {# J% l0 p#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset : W2 n0 t/ |8 H! f# Create SVM classification object ) x+ e/ B4 D$ ~, ?
9 G* o# o& O) u8 l9 c' _& bmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail. ) }/ d L! N- _! L5 D: q1 P' ] + C% E3 _( J2 D" ~% x j# Train the model using the training sets and check score " F' z7 S8 E% @- kmodel.fit(X, y) 0 c0 ^+ t/ Q' \9 i! S2 ?8 dmodel.score(X, y) j$ M7 o' X7 y- y, L9 {7 g/ e& b. M1 w! y) _
#Predict Output4 O( Y: S: T, a$ {+ P+ l; @
predicted= model.predict(x_test)% f+ W% ]% q R' L. q8 K2 b
5. 朴素贝叶斯 - l0 s& G h) W+ h) Q5 V这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。$ H2 f8 O1 r- W& d& o% s
7 F7 ^1 m' |; D- t3 h5 n' I5 C F朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。 5 Z2 Q! | e$ i" R: S/ c$ x9 O) {+ M; Y/ ?% n! k5 m
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:. n# X$ t2 d& h3 d8 _! D7 |
/ t+ E, ~& J" y! N0 f4 l2 D