数学建模社区-数学中国

标题: 机器学习算法整理(内含代码) [打印本页]

作者: 杨利霞    时间: 2021-4-9 16:23
标题: 机器学习算法整理(内含代码)

9 A7 i5 G% s2 l机器学习算法整理(内含代码)# J. u2 ?6 H) B, m" d8 q

, R6 J  N, h2 Z; {一般来说,机器学习有三种算法:: M: K9 ^- R* B* R9 Z) W
7 E( S6 P6 j& A5 \
1.监督式学习
1 z5 I+ L) z( m2 I# e% j) _5 m6 ?% I) G1 R. w/ Z0 ?/ l
监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率$ n' A/ f  |$ _( o" _
9 ?" z2 d! z& o7 H3 ~" O- y
属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法( \& b7 ]8 k* o' E6 J% u. i- Q

0 }; N% f, W% i6 S; T$ [2.无监督式算法( h% L7 @$ {8 h* i5 ~. b0 p9 E

" j% `( q7 g/ ~无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.: O  L1 d( q* ?9 |" L
2 `) T( _( P: o. M( ^) b1 I' n5 x
属于无监督式学习的算法有:关联规则,K-means聚类算法等* x5 M7 e6 U+ j8 N8 `3 Q  w

0 |# T6 Y- ]1 T, c  @6 s  Q3.强化学习; J! M/ C, B( K+ G7 W3 v! }# _

+ Z+ N7 V# T3 b# G# m( {0 Y这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
! U0 i8 ~( w) U- S2 F
4 P. b; F$ T0 b$ O) ~6 V属于强化学习的算法有:马尔可夫决策过程
7 G0 \3 b3 U. [: T6 S, O" X/ c* C7 D% \2 n# N) ?4 a
常见的机器学习算法有:
! i, }. |3 H, \8 S, {
2 ~% a+ q# V: x3 o/ Y0 x
4 Q% [/ |1 t' I9 x. m1 i5 y- R1.线性回归 (Linear Regression), I% R  _; q5 H& @+ c2 L
8 b; ?5 }* {* W' @; Y$ J7 I9 ]; w
2.逻辑回归 (Logistic Regression)# v  F1 @% g( @- K7 P" e

9 y8 d+ H( c8 h  B3.决策树 (Decision Tree)' O$ U0 i3 u4 [8 v8 j' s2 X

6 ~+ j8 B' t: ]# u! M* f5 z$ x4.支持向量机(SVM)
$ F) m( f: n9 N$ [9 @* j/ H/ x# D2 Z" m8 K, a
5.朴素贝叶斯 (Naive Bayes)( u2 @5 l% g7 L* }* ~5 _7 E
5 p* S& f  x8 l6 I" d. ^/ D
6.K邻近算法(KNN)
" U. f7 P' T1 S  e0 E" T0 c
5 G( K' q1 M- B0 q) y7.K-均值算法(K-means)
' v3 M- u% t0 X" v$ k* b& N6 d% I8 X" h" E
8.随机森林 (Random Forest)
! E+ Z2 R: u! e' z! w& t! H+ ?6 S) R5 E
% S( v; C  r. g+ S3 ?( `1 N  @9.降低维度算法(Dimensionality Reduction Algorithms)
& k  q  c0 }' u, r! I& t
' m8 c( \1 @" Y2 j7 e# {3 ?10.Gradient Boost和Adaboost算法
! P. i; e' E" H$ p5 k+ a7 S一个一个来说:$ z. b. a7 c: S2 x$ V# A( V
1.线性回归8 V4 @8 y! n* |. K7 a( |8 M- F9 G
' c9 h) q+ E6 X* N
线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.4 c; j5 I9 _4 h' t. v: x. A- i; [
8 _3 T" m7 W. q+ z
在这个Y=ax+b这个公式里:5 T8 Q) n5 H& F$ B4 `; F! g

7 x& m, A8 K& s( j" {& b3 ~0 D6 M Y=因变量
8 q9 \' l% @! D; i6 |5 s% ?
$ u9 a1 F1 _& ^ a =斜率% {- G1 h7 f7 Y6 z; _3 z
& J9 M( s1 {/ h5 }, g) ?
x=自变量
/ v' d& l5 i8 f; k; N) M" ?3 Z$ u3 E4 K( I( ]9 y
b=截距
$ ^8 V. [9 |$ I! `8 C" G/ d! f' V/ J+ M/ W
a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
6 J/ w) k+ {2 h( M# V- s
+ N$ e5 i0 O% \, N/ W我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
/ c+ ?2 q8 L6 G; e% j
9 G$ ~% o2 e0 A给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.  X5 U. j6 T% G9 ^/ [8 u
3 m' T) u1 L0 g6 |
% r! l" ?; X9 g1 _/ O4 Y7 ^2 P4 {

# f- Q) r+ L- f1 Y线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.( H6 b0 Y0 Y3 Y; _
/ i5 h' g& [9 A, E# t( c
拟合多元线性回归的时候,可以利用多项式回归或曲线回归
# a8 A. k9 {& ?' c( G  I1 [! n) _2 z. \. r9 D: |
Import Library% Q) E# A/ U$ x8 _- l
from sklearn import linear_model3 W8 a' S& z/ F% c2 ^1 C

6 b9 l  B) g0 w  j. K/ bx_train=input_variables_values_training_datasets& d! c0 l5 Q0 U8 Q
y_train=target_variables_values_training_datasets5 m' L8 U7 e" d) C( w9 Y; ?
x_test=input_variables_values_test_datasets
% R! }: }. H" }/ W& _
1 A- f, G0 }5 P' Y$ ?# Create linear regression object
4 v) o. F1 O3 }* `& klinear = linear_model.LinearRegression()
2 B; Z* k, A$ v" ~( Z3 U$ D: u$ `1 X
, H8 q: a; C2 d# Train the model using the training sets and check score4 Y9 x& n6 c  c, e& y% |2 `
linear.fit(x_train, y_train)
4 u2 L' x/ g) S5 W6 g% Y8 ilinear.score(x_train, y_train)% Y4 Z. n% R2 o$ _+ v
2 i$ ~, v, D8 s9 S6 _- @
#Equation coefficient and Intercept( Y+ a, ]4 {# }6 k# N' f1 p2 D0 e
print('Coefficient: \n', linear.coef_)+ `1 j, C" X$ ~. n# S0 ~
print('Intercept: \n', linear.intercept_)3 j4 X# ^" |# u# T; Q

& m% Y- |) S. v8 c; m#Predict Output- a8 `5 O8 `) ]$ S2 b3 |
predicted= linear.predict(x_test)/ k3 F3 V5 Z6 @6 y: J
2.逻辑回归
+ O# \8 b/ n8 @9 o逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!/ C5 T% C) e2 e$ K: T; u
  f9 {3 s$ r* g- v
同样用例子来理解:* L' l9 W9 Z/ Q4 ]4 g9 [

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

5 j0 D( O* `: @/ ?/ K+ D  k- u3 g! P9 }( {5 \1 W6 a4 Y$ Z
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。: J$ t: w5 ]$ i; o! H; x* |6 a/ {- |

/ 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

5 {1 P% a% b( Q( J- \' E/ e9 F" [" R' V1 `& ]1 X: o
K均值算法如何划分集群:; t3 |  s; l6 n8 {: S# N# {
6 ~4 e8 E) f4 S8 f1 _) k
$ ^+ x0 F4 I( u) Z+ O+ A$ N) J

+ u" D$ ?3 e- R& _! o) j从每个集群中选取K个数据点作为质心(centroids)。
) D2 H2 f% w9 l) N! z3 B2 H+ A/ g$ Z4 W2 U+ a& g: V
将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
/ N0 B  A: H2 L& Q1 d6 q$ [4 \- c1 p0 `6 T6 |
找出新集群的质心,这样就有了新的质心。# Z9 Y2 Q# R( G2 d3 V& g1 ~- x

. j) Q' w0 J" `+ @  c* }重复2和3,直到结果收敛,即不再有新的质心出现。4 K; _- P5 X' ~6 Z' r& O+ V

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

* X1 J/ y' R: V9 q: S我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
1 i+ V/ {4 B8 `4 p+ a" h+ M- j6 k' n! d! e# v

% b  P) X. C3 z" L#Import Library
+ \7 {0 g2 ?* x" @from sklearn.cluster import KMeans4 Y' p, l* M; m, F/ r

7 |( E: y3 K# q- D" Q#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset2 L  Q# `/ i+ C4 s
# Create KNeighbors classifier object model
! r! n( S2 P4 b+ m# Gk_means = KMeans(n_clusters=3, random_state=0)
9 S3 T) L( G- l2 ]
" K! f% s3 ], t# Train the model using the training sets and check score, G  i5 P8 @' |  I7 z
model.fit(X)6 L$ H5 F4 o' M
5 g% p4 k. W5 x( C
#Predict Output# D) S( x* |' O1 D2 |
predicted= model.predict(x_test)0 X, A  W7 @( `% e/ p+ w
8.随机森林
2 U9 E0 I1 A, `. h) H随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
7 O3 B9 }2 S6 |% e/ _. n
7 I& O# o/ T% C4 s( ~2 Y* P怎样生成决策树:7 {  k$ y  f5 W
% ?" R3 _6 H( ]8 F
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
8 ?- R8 q9 G. q, ?4 L6 N: \: T+ ^1 I5 P& f) l  u: f2 s0 a+ `
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。* P  |2 ^+ n& k2 q

( \3 l7 s; n! A/ B0 L每个决策树都最大程度上进行分割,没有剪枝。, {8 u" f5 v0 }9 m7 Y, q' y$ @8 F

/ b9 d+ A. W" @! E; J* ~+ s1 D/ D#Import Library
% k! X# r6 d! w; W% y9 Mfrom sklearn.ensemble import RandomForestClassifier' d2 }8 ?8 ^& [$ ]
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
2 S0 c% f+ Z4 v
6 c+ @  `2 f, ]  {4 d# ~# Create Random Forest object
4 A3 s8 ]3 v+ z, m1 G9 a8 q; n' lmodel= RandomForestClassifier()
' Z: @6 E/ j3 v9 F1 x5 G6 ~3 k9 A- L# M: [; b7 Q  m, q
# Train the model using the training sets and check score2 s% ~- B3 Y" |4 ]' [1 x
model.fit(X, y)
. j' w( K! K- }! }1 ]$ @7 x% u/ J8 D4 L3 {' m3 u0 }) Y
#Predict Output
( p, B2 D& `% A& [7 M5 Bpredicted= model.predict(x_test)
# A8 \! }9 y9 C" r( w7 ^: c9.降维算法(Dimensionality Reduction Algorithms)
5 ~$ {* z# j9 W! O! z- [& R1 Z6 U8 ~在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。0 J0 o9 R1 K* R  f1 ~8 a

7 C! w: i5 l3 r3 r7 p. B, n9 y% H例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。. Z3 F0 F  h0 F; E9 a& ?2 J
  h/ O( A( o, Z2 d5 [0 ^% [
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。. \" p& {$ @, e; I

% D# ^$ S/ J$ Y: p: m. L& _
$ C0 f: N% e( Z1 r6 `! q  f% q#Import Library( v% L1 @# ^! _
from sklearn import decomposition
) j/ ^. @# m9 C/ }0 x7 M#Assumed you have training and test data set as train and test0 x' J3 |# v" S$ l6 X! a% e
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)& y2 s* r4 ?3 K
# For Factor analysis- R4 {  t/ |6 @, a; d# B
#fa= decomposition.FactorAnalysis()9 X, l  k3 o4 ]" I
# Reduced the dimension of training dataset using PCA
+ `/ p- l/ p- L( k; o' t  C, q# q& B3 m; x+ M' v
train_reduced = pca.fit_transform(train)$ M& w% T# b" n. N2 d, E2 ~/ r
; R+ i7 z$ }3 k1 w- {
#Reduced the dimension of test dataset
, G% d. l3 _- h7 ?test_reduced = pca.transform(test)* G( m  g/ @$ ]7 v
10.Gradient Boosing 和 AdaBoost; L/ i. S2 T: u+ X: h
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
2 t4 z7 l7 h* e; s
$ k3 S& \! E3 j6 j4 l  T2 D8 ?#Import Library/ q, x5 W! {( z- S6 O
from sklearn.ensemble import GradientBoostingClassifier& O3 @6 s* ~- [2 s. ~+ f8 q# F/ x
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset! \/ p4 l' l1 q, \2 |" V6 T5 D" U+ _
# Create Gradient Boosting Classifier object) i! A0 Q. K3 G! e
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
0 k. p0 ?8 S( A7 j6 W9 P- s% r% T: l8 Z3 D6 t
# Train the model using the training sets and check score
' J0 L6 \5 E+ R5 nmodel.fit(X, y)
2 t3 X  V6 ]# ^( K#Predict Output
6 Y/ r5 u2 w1 j3 y# S& L2 s3 A% zpredicted= model.predict(x_test): p$ q7 Q* N. Y/ I" h' Y
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
+ q) K/ D  G& o& P7 y9 h$ E2 [$ D+ v% H! I5 t, }
原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
4 @) ]( n- d4 W8 h: U3 U; o————————————————1 y, j" r- ]! [( i
版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! O2 v2 c$ i% i2 ^5 D1 W原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
& G/ H4 {# [. M8 R. G: {: X+ U1 g2 a) t8 W6 H
, ]$ I+ m! r  ~





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5