8 e! ?- d: k% _0 @: C数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧 3 Q& P3 |) n" b( x1 _0 v, @5 f5 [0 y: p
最终事件的预测变量的线性组合就是: - m# v2 p- p9 B$ E) {5 F+ c7 @9 j6 X
3 k+ f7 ?$ E0 Q7 q. |8 }
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence 1 D* V" c/ t( A- U. T& O& t7 f; o) R
ln(odds) = ln(p/(1-p)) ; h2 {/ h# L6 P5 }9 a6 C4 j" s! M! F* A& _2 B! [
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk3 f! }8 y J, |) N; C, u+ m
在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.% b. s5 U- h7 v5 |3 N
/ q# l; ~" z" H/ D至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.) h+ ]$ f, O* X2 c3 E' x
5 x+ U$ a! W- e, ]+ s: h' f . G4 t/ z3 S2 p3 x" T! ~, L 8 T5 \3 e) I3 i+ J7 F from sklearn.linear_model import LogisticRegression! C. m. c: g6 Y9 a8 E6 l
9 c8 R) T1 ^1 E4 W7 | ^, O$ g model = LogisticRegression()) }- p3 e: T: f7 {" I
3 ~9 f7 {& k" W7 r. { # Train the model using the training sets and check score " W' ?# v4 K2 r5 K2 d9 g1 } model.fit(X, y)- B* v0 }# t# o- O
model.score(X, y) 3 y, U4 z8 N+ S" S5 p& d7 @. Y% J, P0 z7 C1 A2 w" s
#Equation coefficient and Intercept # |( r! ?& x9 H& \0 Q7 |9 k4 N print('Coefficient: \n', model.coef_) ; D6 Z' E6 }5 s3 z( E print('Intercept: \n', model.intercept_), W; N2 p6 e6 t- {( j
$ o4 S& f! E u1 v3 j# C #Predict Output( g. {2 P g- W
predicted= model.predict(x_test)0 ^$ }' p( o _
逻辑回归的优化: : v, r/ r2 {- b! N' @- O4 ~加入交互项 6 z: d) n T- v3 j, ^, R: ^1 Y& }- k# P3 x9 Z O
减少特征变量% n8 o% |; G# F2 F( h$ P
0 U/ o7 g$ {/ A6 w" a8 N 正则化6 W8 g2 F" I1 S$ w. i K
0 w; V0 y+ U+ y& o- h) v 使用非线性模型 8 F$ L& }0 O" U, R6 s4 h. q4 `. I! ^3 x4 f5 X1 \/ l% T( L
3.决策树 + b7 e% A6 w' ]: a/ G这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。 , d- @9 S; z0 k2 ?# R" z3 e5 G/ w/ r 2 ^/ U$ ^+ [; g" v* E, v/ ^ _2 u2 M" _/ @/ y
: s& D9 o) \- B# S& ~1 _
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。8 o& a. w. O* j) m
& B- o% \5 T, G e
! @0 |! |9 Z. l Jfrom sklearn import tree X% I, K0 r( e& y- c: P * n& ]' I# r2 N+ `$ B( ^ 4 G/ K, K+ T" \9 z- p# Create tree object g8 A/ L: q8 tmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini . n6 K; K6 P3 b+ w, R9 W% E* M4 P7 ]% ~% B( p
# model = tree.DecisionTreeRegressor() for regression& O+ b( i, T$ K) P2 ~
% W+ e% ?) u ~$ R5 M
# Train the model using the training sets and check score 1 k% C% ^1 P! B" \* f1 D: O) Dmodel.fit(X, y) 1 W( e9 _- E$ ~, _model.score(X, y) 0 ~* ]3 P! e; Q3 m/ ~! N. X% U ; _: _6 z5 V' }# }+ [0 @#Predict Output$ G$ o9 S' K) }. s, R- b
predicted= model.predict(x_test) + D+ a0 S$ j. j4. 支持向量机(SVM)3 w7 _2 Z' J1 |4 ^- k
这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。 % \) G4 F& X+ z" g# @& \ / y9 `% t6 T. Z/ i2 B: G现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。 ; \% n# `1 b# ]: S8 y5 F7 y" W: @+ y9 ]1 x2 `9 {; n
% Z! V" L! ]- g- o8 _4 l4 ~" t5 M
& G j: T3 A: j
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。 $ g: g6 d" f- M 1 h9 H0 ^+ w0 O% `' R8 n' {#Import Library `" J- b0 u! ^. C! n5 h: l& ~! s
from sklearn import svm 0 {8 Q& u) c. Z+ D0 t: j% h#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset1 E/ i! M- z* d8 m8 d! V: v) H
# Create SVM classification object 5 W# o/ N, Y# ^- S
3 a7 V6 {9 \& J' ^* h& {: w
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.* X( C! e8 c% T/ H3 S* U% _# |* w
- l) V: ^" a/ Y& S1 [' V# Train the model using the training sets and check score # W6 H2 H4 d& u( |# j$ ]7 X. gmodel.fit(X, y)( X$ m/ c) ^9 U
model.score(X, y)' w# |$ a" h! W1 @: t
. v/ B0 w" A' U/ n ^8 O#Predict Output ( Q7 a$ B$ r5 S% h e/ u) p5 ~3 @predicted= model.predict(x_test)- h0 K; C4 e5 A5 O; d) ?
5. 朴素贝叶斯! E- j. R6 Q1 [# w2 I
这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。 % C; ]6 I( L6 H+ M 7 x9 ~4 y2 d H% D7 o朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。" U. Z/ X" p* U; u
& h* T0 {8 {* l3 G
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:& X4 o6 a: Z" p+ \) d: |) t8 Q) ~
7 Z1 @7 {, U$ X# z; O1 `
: D9 A3 j" v$ k* N
P(c|x)是已知特征x而分类为c的后验概率。 0 T. @( R9 h& c1 d( o/ H! |3 b3 g : A3 e0 t0 P+ P/ gP(c)是种类c的先验概率。 Z( A# L( X, Q9 J
& f' d; D/ i0 ]1 U9 _
P(x|c)是种类c具有特征x的可能性。/ ?/ I) L/ S0 |5 e! `0 B
. m7 a/ w" B7 R7 k; S7 JP(x)是特征x的先验概率。 ( _0 h+ k g, G3 H% _. E: D7 Y1 N9 i' J: V4 U; a! ]' q x6 z
# v$ a D+ N: y
例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:; O& U5 ?3 m9 P: g" r
; `$ `( J4 C$ _ & B3 k7 h- d& c: x. ZKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。 5 ]& C8 w( D( \7 L) _ / M% E$ a4 Y. K; b( t3 K- m在用KNN前你需要考虑到:* e9 t1 r+ F) p/ z, s$ x7 C& H# s6 C! _
2 d1 i- G# b. x3 a9 \% s
KNN的计算成本很高! ~, d" { ~6 u) r9 Z
; m, S/ a5 _ F) L& Y
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。 , i' L/ j& l0 @& M* n5 m4 w8 v' g" u4 [
在进行KNN前预处理数据,例如去除异常值,噪音等。$ K* z% o. b& N6 `6 v" E, B
7 i% X# V/ p4 `4 G" }* c1 u/ }#Import Library4 b v8 W N! t& L$ j0 `
from sklearn.neighbors import KNeighborsClassifier/ P, D" d0 M* }0 I1 L" T* B; h
# {) W7 d; F$ e; y9 u; n3 Z
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset * A5 E+ F }$ ]; U6 i' w. u# Create KNeighbors classifier object model 7 \" l$ F5 U5 W7 n4 v" L) d6 s6 l0 C( {7 t
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5 % [: H5 o# Z4 ~, w" I6 R 5 j; Q' t4 |* C: s* y# ]# Train the model using the training sets and check score* @' g6 w9 t( m5 a
model.fit(X, y)- I" z- j* n0 S
8 x V1 _7 V& ~4 \#Predict Output 0 R/ j; v5 g l. _predicted= model.predict(x_test) / n# ^# w! j& x7 u, a- a1 x7. K均值算法(K-Means)% H* A8 _' a7 z, F1 g
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。( R& H' Y9 k8 N- e+ Q
' R: z/ o7 v. a9 W. K' U还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量! 7 x( l5 i. f+ u( H5 U, E# [+ ~- m 2 T, `% v/ E" G% v5 ]- d( T 2 A$ ?/ z8 b- G# j5 w( Y9 iK均值算法如何划分集群: 0 I! T' k7 W. ]' A9 A: B! M& m( f8 f7 N2 E- |) x
; F% `+ ^5 f( p6 X1 |+ c2 `- d
3 U2 d( [2 Q* B6 o6 w
从每个集群中选取K个数据点作为质心(centroids)。 5 _& ~* T5 ~: f0 c% s$ j* B5 m; j; y8 O , x3 D* S8 k4 s4 G/ l5 P将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。* p* n1 ~/ E) @4 y4 D5 a
3 C) B6 Z% ~3 W
找出新集群的质心,这样就有了新的质心。0 ~! y* |; Y) Q s$ e
% v6 m) c* Y- {" r9 A9 J- [重复2和3,直到结果收敛,即不再有新的质心出现。 : B' C1 N/ J3 i, U. a* Z4 j 5 T' d3 W6 V5 ]. \5 V+ Y3 J0 j8 Y% h8 W
怎样确定K的值:/ H) `+ V' j. [$ e) U
1 @" V5 Y, T$ N3 b6 X' A
如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。 / K; f% Q' {. h4 p0 |, v" t0 N2 g4 }$ Q. q/ ?$ v4 |
我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。 ( V! ~$ D: \! D% u% j' m) }2 _: R; }' d$ S5 @0 {- L
7 O) s( n( x& @: L6 e8 N# i#Import Library) w# N- w& o9 c2 Z* q$ u* S* C
from sklearn.cluster import KMeans ! L* Z0 \9 F( l 2 N( `! ^( E% j( i#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset 4 n# t5 v' K; s+ H- e+ @# Create KNeighbors classifier object model - @% h! {' d5 z( o8 _5 D9 d5 s( h
k_means = KMeans(n_clusters=3, random_state=0) & ^ V( ^7 W$ f$ [ & J- r& j: l3 k5 n" x# Train the model using the training sets and check score5 R9 F% q r$ P t9 n
model.fit(X) & r# h$ U: f% G: a' w4 h8 v5 ^1 \4 ?
#Predict Output7 x8 f/ y1 ^7 {6 j7 w& L; G, @
predicted= model.predict(x_test) / ^ c5 t: j; ]8.随机森林 * u' v+ X/ q0 A随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。/ E8 R: R4 T# A1 f7 }2 `
/ o% h* y/ L5 X
怎样生成决策树: T6 b& ~- q, c4 h8 R( C! ~ % L. X4 @5 R( m! ^7 w( p/ Y) U如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。4 P0 W$ j# ^0 Y
- j5 H- F9 V$ g! ?& q3 }; f, U3 @
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。 1 v: m, }" F. A1 Q: i& `! T6 C2 H
每个决策树都最大程度上进行分割,没有剪枝。$ y$ R; {6 e2 E/ f0 {! L
! q8 @- o& `( e; _
#Import Library ) C5 n0 ~& D% _: y r" e4 M1 o; r3 Ofrom sklearn.ensemble import RandomForestClassifier; X' R O: v' V, }% G+ O$ B
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset- G i+ j" _9 X$ ?- k! n& V
- o6 r, @2 b$ p' @4 o t6 o# Create Random Forest object 0 T9 n6 p, y# J: m( K9 X/ gmodel= RandomForestClassifier()+ q; u8 t, U& c
. Q* A4 t5 N& i6 T4 E
# Train the model using the training sets and check score0 b, @9 P$ |) X0 h* |- n
model.fit(X, y) % e1 S9 j7 G/ ]/ i8 W' g6 i( D; \2 L6 I7 L
#Predict Output. ^4 b; e; l/ s# p6 p8 P
predicted= model.predict(x_test) 5 o1 s( |6 j9 Y! {9.降维算法(Dimensionality Reduction Algorithms) : f- F" x2 g+ G: f0 n* x7 b; X0 q在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。 + Y* s" V0 r; b2 d3 z6 k) i* ?" ` 5 q* F Y7 a9 Z/ P, f) D例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。 4 S8 x C8 z# j 3 P9 F+ c: M+ F6 q5 ~, J( Q作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。 ( V' G) s! l8 e6 g ' ^: T$ W$ r, c7 o$ N# Q& { m4 X6 x/ o6 Q4 B% s
#Import Library# m( Z' u' l1 @3 W
from sklearn import decomposition - b/ @4 F+ F. [, W+ X" V4 t3 X" O#Assumed you have training and test data set as train and test4 V9 }2 B9 W% w1 L5 b; C8 C
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) + B8 r6 ~9 K( k0 u3 j# For Factor analysis$ M) w3 \: Q5 o" O2 e) ^; w' I7 t1 Q
#fa= decomposition.FactorAnalysis() 6 k+ |- L5 F" Y3 \; }6 q1 ?# Reduced the dimension of training dataset using PCA. Y6 e y3 |1 X# q
5 |" U2 r9 t" l1 xtrain_reduced = pca.fit_transform(train)# |1 m* y4 m$ D0 i* N* m
! `( E. d3 o3 M" u' H#Reduced the dimension of test dataset 7 o1 M2 J, r5 X- f; Q) gtest_reduced = pca.transform(test)( l& _. c }+ _* [( y0 I o E
10.Gradient Boosing 和 AdaBoost) B0 O8 s9 z( q3 S/ \: u
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。 * i3 j! C( I5 Z7 D' x z3 u2 L ) s8 F. J: j8 Z) P#Import Library + a; r$ T( ]5 B5 g) Mfrom sklearn.ensemble import GradientBoostingClassifier - p# m$ h1 X: l#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 S0 X$ q: o' z
# Create Gradient Boosting Classifier object) f0 {* g! k/ ?8 @' ?# f- p# \7 T
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0) : D$ u' u a, O2 F4 D ' s/ t; f! Y2 I& g. h) {- f& e# q# Train the model using the training sets and check score ' J- d" D! a7 p9 V! [8 pmodel.fit(X, y): r/ W- u5 e/ J1 D9 a$ b& {
#Predict Output2 K/ r# M7 F' _; D8 \- j
predicted= model.predict(x_test)7 t2 o. y; x$ x6 d1 {& ^9 o I6 d
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。2 e- U ~# b9 c! j& e3 [