数学建模社区-数学中国

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

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

2 k0 u8 l6 v, q机器学习算法整理(内含代码)
- b' y5 a9 C( ?7 _1 w, G! D1 J* k! S+ ^& s4 l. v
一般来说,机器学习有三种算法:
7 b9 }) \+ }( M" N
$ g" h! @1 `6 H& K% ]1 G1.监督式学习
# N- E, n; B# b3 ?: Y) ~
) a# s: F& ^2 h0 M) s: e8 Y$ I 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率4 D- b& a/ G+ ?' v  q  r2 _

# B2 l( ^( Y' R% ?1 x属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
- p1 W. v) U, }. O' y. U! b% d$ S9 w3 G, ?6 _& m# m  z, u7 V
2.无监督式算法! p! g5 T# E+ u
3 v# E' D* w2 J$ s: |  R2 b) o
无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
& `# g+ X; F" E' e
4 {3 u. r) b: N属于无监督式学习的算法有:关联规则,K-means聚类算法等
+ B0 w1 Y* a4 U! D8 e, Z0 t9 I! c+ q& k
3.强化学习
' s& \  o2 o3 Y7 K% {. @
2 h: g9 p3 X( W8 G3 S这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定# Y6 P% ^$ r2 v* N% i

: |2 d+ g+ S- S; C, N9 P9 b: D属于强化学习的算法有:马尔可夫决策过程' p' L% t- A2 a4 s8 R6 x' Y/ J
9 ~/ r5 c* o+ _) L  K) A$ D
常见的机器学习算法有:
; E5 j, i5 @  E4 o" ~# D; f* D' s% A! k/ c' R  q

8 @# ^9 w- {# N7 @. c2 z6 X1.线性回归 (Linear Regression)
1 V* ~0 O1 s4 R( M9 Q. ~$ R: V( k1 ]6 J: U  R
2.逻辑回归 (Logistic Regression)
" l6 C7 z8 ~9 k2 [8 k& ~8 C" O. X5 R/ e! X4 N
3.决策树 (Decision Tree)
+ B* b% ^7 O4 x1 ?6 E. N& P% U4 ]+ B
4.支持向量机(SVM)
* Z: U- f' G# x/ ?0 s( R, Z/ g" b. d8 K
5.朴素贝叶斯 (Naive Bayes)
2 o+ V9 ]! f, U- n0 M) b# e# w' ~
6.K邻近算法(KNN)
8 S* M0 v) d5 Y3 h6 M* ^
7 G- x# _% b1 Z4 v9 q$ U7.K-均值算法(K-means): Z6 u- ?2 \3 s& @

" }- R% N2 t* |, W) B% Q  Z8.随机森林 (Random Forest)
9 I$ Q, F+ o' _7 S
( q# {5 @$ m9 n  i/ b* j; K9.降低维度算法(Dimensionality Reduction Algorithms)- ]" Q0 O- x6 m; e' W' z

4 ]5 `+ P" u  A10.Gradient Boost和Adaboost算法
  Q% g. \0 E7 B+ m4 O一个一个来说:
) Q9 B8 l' m  O. Y0 v1.线性回归
, Q  u! T2 s- R; h/ {
: Y6 ?% u  ?% I3 y5 g6 q/ ?6 A, Y线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.  a8 f7 n5 ~; n

+ }) _9 W  z1 m1 b" z在这个Y=ax+b这个公式里:& u( i7 w3 K' @- n% Q/ r; ]+ y% Y( \
: e% Z% O, c# q) Z- ^# q
Y=因变量! F  A' D2 u! G% x( ?, l

( _: x* @: }% t+ ~/ F" R a =斜率
5 P/ F$ P, z  t7 ]* r# a3 ?4 Y0 }! h9 a* s* ?
x=自变量
3 C9 S% i  Q- h
. x6 u8 A; m7 N& J3 M b=截距
: K8 p1 T2 N  k/ [( a
* X4 L/ _1 D, a$ j( ?& u+ U& V9 J a和b可以通过最下化因变量误差的平方和得到(最小二乘法)2 c8 G1 E3 |. J8 ^  a( W

! Z* w8 y6 h3 R7 ~4 A9 V: N我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
4 f6 k( d2 ~- y9 [3 b1 h" Q& Z# H4 P7 T! W0 _5 H8 f4 x# B5 [
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
# _( W' g* H& F4 Q7 w" o* G+ [! c) F
, L3 a0 `/ o8 W
! l9 b% d+ l! M1 ^# n
线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.- m" e% k6 K6 Y8 G4 R
  h% {! a+ c; V& r* A, B4 U9 p
拟合多元线性回归的时候,可以利用多项式回归或曲线回归
" g% ?% x7 `& K7 i1 E& Z4 K; T
  L% H1 `6 \5 @7 H- a; z. m( jImport Library! ]7 }& q0 w+ [" i
from sklearn import linear_model
  J# F, I% e1 c: O) j1 O4 m
+ e, a, |2 k2 y- w  [' Wx_train=input_variables_values_training_datasets
: ~; o: ]4 X3 N# A6 ]- uy_train=target_variables_values_training_datasets7 g1 l9 D# g) C% t8 D6 E
x_test=input_variables_values_test_datasets
9 e" y( i+ G$ I" I5 w) K/ K
; b) I4 l! K9 u& b$ v+ }# Create linear regression object
+ a/ O* S. h3 s( r5 Slinear = linear_model.LinearRegression()
1 E# q) H  N9 l9 N' O7 o% D, I5 u* l/ B# g
# Train the model using the training sets and check score, c, n" W8 [" W5 n( c' c$ {# Q
linear.fit(x_train, y_train)6 x, E- G2 U7 `1 K$ F$ o7 Y1 a
linear.score(x_train, y_train)0 E) N& O4 I1 v. A
0 ^- b7 ?; F' G! c
#Equation coefficient and Intercept8 \4 _* w7 W3 z; B. P; F; }: E# e; o
print('Coefficient: \n', linear.coef_)( }1 f7 _8 s! I+ i% ?* u
print('Intercept: \n', linear.intercept_)! B( V! i0 e  p, O6 f. D5 V
# S. L+ C! E6 X8 w
#Predict Output
* |' x8 ^5 t9 B0 o7 b- k! Y# P2 Spredicted= linear.predict(x_test)9 U  i% ?3 e; A+ M* V9 W  P
2.逻辑回归
# r' X6 m/ I) V7 _7 q逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
) i" e5 _9 [( E/ J
2 O# `: G8 q5 |7 N# B& P; D同样用例子来理解:
  A4 Y; m3 @1 S0 H  F' @$ L, }* l0 N
假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
; K4 @' W4 R& @7 d6 M3 |( C0 f1 S4 q+ N0 e. s/ d) a
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
% l6 o8 S, \( `- N- a: C% S$ u% j( g* }0 n
最终事件的预测变量的线性组合就是:
* Y, p* ~& a% ?  p, f1 W; ~& i+ a" p* y+ b

" |; i  n3 ]2 j& l, ]) n1 oodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence' ?  `, p+ o5 q2 I2 K
. t$ Z6 a" M: C
ln(odds) = ln(p/(1-p))
. Z$ m' c0 d* z1 {0 n; `9 a0 X; o$ [. M, ]$ g
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk- q! ?* z1 Y1 ~: ~% s! i, z
在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
% v" v2 F1 [, i$ R6 e; C/ X
# z% w$ b6 Q8 F$ w至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
3 x- Q* Z8 K+ u  ~& A6 l
# W) z8 d  a. z
2 |% S/ f( d  o
0 L/ e0 W' y: g8 t from sklearn.linear_model import LogisticRegression
4 S0 L2 u( @. r  \2 |, t2 [
4 u' Z9 f$ J! e0 n model = LogisticRegression()
7 M0 [* [7 t' C/ U+ V, |: o; ]2 h7 Q$ B5 _' U
# Train the model using the training sets and check score6 F  h9 c- d, q2 F# V7 M: I1 K6 e' ^6 T
model.fit(X, y)
6 [# C( z# |( _$ ?) u model.score(X, y)' b7 N+ V/ k: L: \% ?
: Z' u  ?3 k8 J9 Q
#Equation coefficient and Intercept  Z" h& t! _! K8 [9 e
print('Coefficient: \n', model.coef_)
' W  D3 M+ I/ Y4 b' a print('Intercept: \n', model.intercept_)' L* v# v. U* X# a2 D

# e. g1 S/ S; }8 F0 q0 w  z% o$ [+ C #Predict Output
0 ^8 I9 Q. s2 A6 G' s* l& K) H& W predicted= model.predict(x_test)% e1 D. S6 j! |/ {
逻辑回归的优化:
" ^) k" g. P2 x加入交互项
* ~8 s- o) ]  I# g+ K# O+ E2 o$ Z- g) y5 |" o$ V" F4 E- `7 E2 T
  减少特征变量+ N5 D. D5 a' J. [% f4 w! B

$ D& M- v# [& X9 K& C; F% w7 i  正则化
5 q  z6 I) T. C* v# W8 u7 R% Z# a/ x) e" o. \# F
  使用非线性模型
# s0 _* V# s$ y. I# ?$ ^) ^- P2 g; D4 V* h* U& Z
3.决策树
6 [: H) T7 k' V, n0 q0 U8 O这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。4 O3 X6 A: I2 g, `

2 Q: I, b3 E# ]( |8 Q( L" m3 r
( S  M$ F8 S$ G% E$ x6 @( e% A( a7 C1 q* h, r
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。( n7 D5 O) o  a' Z% x# i/ q; j* G

8 i4 g9 }! _3 |, g
2 v5 Z7 b& T$ P8 j7 w- Dfrom sklearn import tree
3 h( B3 V0 I6 y4 x
$ t( @# |7 E$ p2 h' p* T% Y4 E- B! D: M+ v0 X  F, b
# Create tree object
, E! B% Z$ k: d/ Y; ?model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
5 r9 A* [$ R0 X" Z* V& H* R: k1 Z  M  f3 V
# model = tree.DecisionTreeRegressor() for regression' J0 ]) W: T  C7 J

9 ?! X" m! \/ W# Train the model using the training sets and check score
8 E3 R4 k0 l. H: e. O5 q3 tmodel.fit(X, y)
  Y$ E1 {) c" p) w( vmodel.score(X, y)
( \* v  O9 [  y6 g. a5 }: G+ S: S
#Predict Output
( l$ J3 k- \6 f3 Qpredicted= model.predict(x_test)
# n. z- a9 r) C; m: o! Y4. 支持向量机(SVM)0 V' ?% J; E! ?, H
这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
% p8 z# ?5 y8 a. B8 e5 i. j* E& Z' e
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。9 I) F* O# C0 O( Q

& p/ L! ]5 M: A  I
3 a; v+ c- `# Z0 _" j: F6 _7 N4 o
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。5 Y9 y( B" M2 b$ f3 E

0 y; d$ I* R+ W# ~#Import Library
% M1 R% ]$ Y6 Y6 K# D  }from sklearn import svm+ ?9 R+ B* W! }& R# X; _* M
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset) d+ a5 O: h# F/ O2 L
# Create SVM classification object
# c& b2 ]2 p3 K7 ~; e# s2 @5 [) K/ m. n) K  j
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.- [+ V/ K" m: j: a- e

8 b" ]& z7 |! ?; \- o0 R# Train the model using the training sets and check score
- b( u# F' l8 Hmodel.fit(X, y)
: O: O! P4 o" V2 V) Umodel.score(X, y)4 L% M- V3 Z+ ?0 w

6 _) T6 t: ^. b: n/ b2 G, _) Y7 ?#Predict Output$ D5 j: C- a# v- |3 ?2 E9 c
predicted= model.predict(x_test)
# I  A, J, X) O" |% E8 m5. 朴素贝叶斯5 n) J5 F" ]1 G' s& O. C
这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
, l" |) y1 f  R9 K
, g- O' [/ k+ N朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。) G  J, u3 j- L* k6 D7 J' J0 }

5 R$ n1 i. y- H  y* O: ]5 l/ W贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:( t& E4 q& g; b: D6 W
0 @: k7 G1 `4 l: [
* T% \' U. f. F- O% a* q
P(c|x)是已知特征x而分类为c的后验概率。8 n! V2 |7 n0 t/ H' U# R" P, S
- w3 N/ D7 V- c( Z8 S
P(c)是种类c的先验概率。
6 X1 D  A5 N) U" }. P% w4 Q! s: V* }3 }9 z
P(x|c)是种类c具有特征x的可能性。& y9 Q+ U9 w6 w  A+ U

$ Z! r# [4 E0 K$ _/ b- |P(x)是特征x的先验概率。. V: k+ M- l+ ~% r: ^' z+ n

: K& ?! o3 g3 v8 n3 V/ n
1 T1 H& e8 _& ?; u1 _: e/ @, @) m3 r例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:9 ?0 N9 D& X- w; _; g0 Z8 k
, Z+ L% z0 G& K: x6 v. K, i: W
步骤1:根据已知数据做频率表
7 M  w9 x' O9 N5 {: r" ^( v7 g0 E# P9 X# Y  z7 g6 h  U' v2 D; B
步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.5 t) ~1 A. S/ k1 G3 |
5 b5 N, M5 l" B! A# w

; x( h1 G2 h5 K* k- U; g9 Y3 R步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。# L9 F& ^7 `  T4 F' E
提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?9 D# p& r' i# W0 X+ M: @; P

; o; I6 f# t0 y4 Y# z我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
7 j2 O; W) u( O- c
( v$ P% U' x# F6 {& O- o# R4 N/ J这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。0 d  x' u4 z+ S# {0 b+ o
+ C: z9 C, F/ n! T' w
那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
1 a& i/ e4 O0 E6 i3 U: N" S; Q" C+ ?) Q! y4 p
当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。1 l# y" m1 p' L7 j! \7 n0 v* C
7 S2 Z4 o* C( ]
#Import Library* z" Y! [& I1 W2 t
from sklearn.naive_bayes import GaussianNB  x  d8 B9 }9 l+ a, j) X# |
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset8 f+ H! H- k  k- H' S! M4 z0 N

* l! k+ _0 h; p# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link( F+ T8 P/ T3 V3 T1 F

- Z: r  g( i  [& @& r# Train the model using the training sets and check score
* a5 k4 R& b% W6 b" L- P$ ^model.fit(X, y)
+ r# E. J# E8 w) @1 v
9 Q  P- G: B, S# A  M# s% H#Predict Output
/ \' \1 R* y1 S% a2 |0 |: Q* ?predicted= model.predict(x_test): a% n& [% S+ F% m  g: _# j) o
6.KNN(K-邻近算法)8 P8 W5 E$ T; V7 c* u
这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。" n' v! @  C: K* r
# w$ `: y9 b1 F& F- e( d
距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。; N4 H: G9 `( C; ]& G" z
" L$ q) O9 k0 ~6 B
$ i7 w* }# w& ^; A4 H% g
. H) ~9 f  P/ |: L6 p; z6 m
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。# _& k- ]& ^1 {5 i4 X5 c5 y" x
) Q8 a" l( b+ s
在用KNN前你需要考虑到:
: B2 n( t5 O. S+ H% O# C' d& ?( y' b+ U" m; f' l5 x: e( Q
KNN的计算成本很高: V- K3 i! Z- e% ]/ U$ A

1 d5 o( a8 C7 }( o所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。9 [2 w. `3 M3 C2 R* H: Q
# @( B, w! F* e: W- T
在进行KNN前预处理数据,例如去除异常值,噪音等。( O0 v  q6 ]' ]) m2 e, b  E

9 B# i$ c" x( m! b9 e' x9 J#Import Library9 q# C" }; e0 H/ M* w) P$ n3 Y
from sklearn.neighbors import KNeighborsClassifier+ @  i, V: E+ C" ]5 B- q

. c6 N3 g% ^. T, b4 T# G2 x#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset- U2 O/ k5 N3 ?4 A' e$ c
# Create KNeighbors classifier object model
0 j+ Z9 i+ S* P
5 N% Y9 L  J" \2 MKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
, A: v( P- V2 G( q. ^# x2 i6 z" q
# Train the model using the training sets and check score
# `* M( R1 M; k) r( T: W2 p/ fmodel.fit(X, y)
0 R% F6 E! I% e3 Q
9 z* G# d8 z5 e5 C' r! g- i#Predict Output6 ~8 F( ?% s$ W/ U7 g
predicted= model.predict(x_test)( B: N, o) s" F% j+ r
7. K均值算法(K-Means)5 S& J; ^" i$ t& o6 }! }
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
0 {: {' f6 }$ p2 a8 g, B
& _3 N, [# o' T: o- c" M还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
" X- n) I4 z1 t8 u) @3 d# E7 Q, ^  m+ Y" E. s5 [( g
% [2 d2 a4 U1 v4 |; [% ~0 S/ t
K均值算法如何划分集群:
! w4 S( m7 ~1 J
4 `  p; L3 z( k6 s) t; M% s  y% [; a( `- Z( S6 E3 m* W
' o* k* @3 `) w  {  }
从每个集群中选取K个数据点作为质心(centroids)。
% @; F) c! {9 x" n, P0 w7 s- }6 @5 K% c
9 T- x- ?& }, {9 m0 A) U将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
4 d- h* k3 {+ e+ E; D2 T( y1 z2 Y; e, O( H( \6 v& Z4 g! z4 Y
找出新集群的质心,这样就有了新的质心。* R1 v+ N% c/ c$ ~8 @- ]  ~

" B+ p, C) i9 n$ k: F6 p0 X$ B重复2和3,直到结果收敛,即不再有新的质心出现。
2 d! w2 h' f( H( O/ K9 r9 Q1 i3 W
1 W9 J+ }/ {4 k+ `. N
0 X! x: h3 h7 q1 y5 k* R怎样确定K的值:! F, W% l# [- f. y

2 ^, r* r+ @' y! X' D如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。$ I. @- J: @4 K6 }# ?" d. y& n4 W6 D9 S' l' j
' V& d9 B" G4 b; {& k1 B$ I: Y
我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
, k) W$ b8 F- d6 J) G* k$ R. O
( r6 j1 p, u; Y  l# R  I* @
) R- \4 F) S3 F/ H1 V" n#Import Library6 Y% N& p# v9 `2 o2 j/ u& p* _( k
from sklearn.cluster import KMeans9 v4 z: G$ H. j6 h* J& s

3 ?  I* X' V- a/ [#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset; e4 M2 o+ W# z1 J( D3 z
# Create KNeighbors classifier object model 7 m& J9 S' c% T3 |8 ~) a
k_means = KMeans(n_clusters=3, random_state=0)
7 q' J7 K/ G  |. h" [' i. y5 q, {' Y
1 I2 ]# \) W' }# Train the model using the training sets and check score
8 b0 Y& z3 T8 Imodel.fit(X)' J% b  `- n( C- P6 L
5 c2 E  T; N4 l0 p$ Q' s. O
#Predict Output& Q+ A) q- T4 ]; m$ O; y$ `+ s2 c0 t
predicted= model.predict(x_test)  ^2 ~0 ?% n3 t2 y7 o6 h/ l# K7 ?6 p) W
8.随机森林, N7 g/ v* t8 H
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
2 ~1 a9 H/ p. S8 F+ I- E9 ^( h% V% \
怎样生成决策树:
! {6 Q0 k7 A% B) m2 d4 Y
3 |+ Q; v# o5 B6 T如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
1 L5 O  c9 G9 q! q: r
, H( g2 W! Q- m# n, X如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。4 q3 I2 d$ w8 |$ [$ ], U$ `2 _: f

: g6 x9 T5 O4 h2 @; j每个决策树都最大程度上进行分割,没有剪枝。
4 U5 L/ z( f0 R7 N$ a% V7 {  Y$ X/ [0 C* T) R
#Import Library
. n( R0 j, Y+ Y7 }  nfrom sklearn.ensemble import RandomForestClassifier
/ g* q: @* z: A& w$ a#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset8 I( F0 G" ]; U" N

- Y- \! e2 ~! R# Create Random Forest object
  V" _& N) I9 H* B: R! W+ amodel= RandomForestClassifier()
# w: Q" a8 I7 x' A) y" C; m5 G" }
# Train the model using the training sets and check score- \2 O6 t' N" Y" s0 s! c
model.fit(X, y)
: U5 L9 ?/ ^" ~, k* L: k% g
; x* _0 d4 ?9 k# \- s7 \3 f#Predict Output
/ x/ r" v& @; fpredicted= model.predict(x_test)
! N0 f* n  Z$ y5 |7 C! L9.降维算法(Dimensionality Reduction Algorithms)% v3 D; D1 b2 K
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。) G  G( _1 C  P! k$ R# j

. C# F% G8 V/ W/ {3 ?* e: n例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。, O. g+ l/ a; `) S2 K! M# x

' r: U- y/ T6 B  M' P作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。. F6 z7 y2 O: j
) ^7 n) ?, n# a( i

! o/ Y% {' p6 F) G& U# S#Import Library
8 F. C9 P) l  b  t: C1 K! \2 Vfrom sklearn import decomposition
# V: V3 V; Y" u#Assumed you have training and test data set as train and test
& e5 w. e$ g. u8 e% w# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)/ n( q9 W- D, i8 L$ ~" n
# For Factor analysis
) B: l' [4 {, |; o+ G4 T) U#fa= decomposition.FactorAnalysis()4 r* @2 j) {- v/ W: m
# Reduced the dimension of training dataset using PCA$ @4 @: r: q5 F( C! O! ^
4 d! W6 z7 l0 r% p7 E  g
train_reduced = pca.fit_transform(train)
) L& T  s8 _( \1 V6 ?$ I1 b
$ z9 d( p3 }! V; t1 A7 e1 a, K#Reduced the dimension of test dataset
$ b, x: z- I  Z3 xtest_reduced = pca.transform(test)2 O, e1 C4 U5 Y
10.Gradient Boosing 和 AdaBoost* H# M& R& s7 g* K6 t) A/ k6 z
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。7 ^, i( j0 K& M9 \2 K. E

: S) H$ L9 n; ^0 ?9 j* V#Import Library$ O8 ?( i% k2 R- B
from sklearn.ensemble import GradientBoostingClassifier
2 [2 t, T" ]( M$ }+ k  n- X#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
! y) @" L) n( f* r* M# W# Create Gradient Boosting Classifier object
$ V- c: Y! F' L* F8 K5 @! bmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
# p6 `4 @; s% @. M
: q  e9 T+ q8 D# q& `* ^3 Z# Train the model using the training sets and check score
8 E( f' d& M' W& K1 m9 h! i/ Xmodel.fit(X, y)2 T% F# {' m2 _( L6 r
#Predict Output6 ~; o1 y+ w( h' Q8 s" E5 Y2 F6 w" f
predicted= model.predict(x_test)
0 e0 E; l; `- F1 l) MGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
* S1 ~3 p9 c( k; E' o
6 e5 y( x" ~& P. P0 |原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386: L9 y: B) ~! z- K7 q4 a5 M
————————————————
" j7 o4 [( G6 b: K) V9 _- D4 V; f版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 r0 ?' }& G6 w" ^: J9 Y
原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075. r$ t& v1 F  c  p; G7 P# U) F

  T! h) E4 B7 V* F! o4 }0 j
+ ]4 B, f- I! e: Z# q9 C1 q




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