数学建模社区-数学中国

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

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

; h' P3 _2 T: [2 [0 b机器学习算法整理(内含代码); _$ T+ S( F5 Q* A6 `

* N+ b: {5 @, p7 e一般来说,机器学习有三种算法:! ^$ i5 E  o/ Y  Q+ V) q
$ s2 ^! v0 s) ]/ K" D2 }5 p: x
1.监督式学习
/ v& ?! a# i! |4 @6 s' y% w" w: `3 b+ V. D5 b2 ?% M" C$ j0 l
监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率+ \% J' Y# L3 @& @4 ?) `

. d: u5 r, N3 M5 I; U属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
; c8 t' V' B- d+ `2 f3 k8 }7 a* B. n+ ^) y- D, n# J# i
2.无监督式算法1 ]' a7 F" n4 K1 A$ l  p" t2 {7 B

8 o) s) O. W) t2 r2 T2 L无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用." l# `: T) `. J, q
* y( B# q8 D; L$ @. W$ M. |$ l* V
属于无监督式学习的算法有:关联规则,K-means聚类算法等( q3 P* D) l+ ^/ f3 h" U
8 r' t0 t: `" t  ^0 A6 [! _, L
3.强化学习
  H: F( T% B$ f# q2 G4 L* \  d' o, H
这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
9 p5 [0 M: B4 J; b6 ^$ n) \. h1 H4 A1 a% P
属于强化学习的算法有:马尔可夫决策过程# z( P% b/ P; \- r. r# Q# ~
; X! j0 w2 x1 ~# d% q" }% D# D1 ^
常见的机器学习算法有:( N. _. U) p" n; L+ P

! A7 l% I  b% a, K
! A( k) Z/ U" G3 a1.线性回归 (Linear Regression)& N% X- V( U& F2 S7 Y

* [) y, W8 u$ J2.逻辑回归 (Logistic Regression)  b1 w8 `# ^( ?- R! Q
0 L3 C0 x3 G! H
3.决策树 (Decision Tree)
0 V/ q( Z+ `9 t  e3 G3 H' ]: |8 B
5 ?+ S/ ^1 H" l2 M+ T4.支持向量机(SVM)
( a, V( S, d) Y
$ F& n8 R0 C$ e* M# l5.朴素贝叶斯 (Naive Bayes)
# d- x, C" U- R' T( J6 ~2 p
) O2 O; e1 X' C6.K邻近算法(KNN)& N* m7 b1 Q& R; Y* Y5 _

! `  ?" M/ _) K0 Q1 q" Q7.K-均值算法(K-means)
5 {9 B; H  I" {( _2 O
* \7 l. e' x5 B0 `3 I$ S8.随机森林 (Random Forest)- i$ G6 M1 A' I
4 T; t2 `0 w- w) o7 n
9.降低维度算法(Dimensionality Reduction Algorithms)
: ]% r) X1 O) Z7 X8 v3 y; r) E3 ?  u: v; b* a
10.Gradient Boost和Adaboost算法
8 w5 X6 L& g, b5 [9 N/ a, |9 d一个一个来说:
5 q, d: o. v% R7 c0 d  Z( [! `2 V1.线性回归
4 T4 Q% A4 J5 h( Y5 r( i# Q0 g$ N+ N: A+ i
线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.$ o5 J% R- j* D9 I' y

8 @2 h! V7 _2 K3 W2 g, [0 f4 K在这个Y=ax+b这个公式里:. P1 _! u/ V6 Z( L: U1 k) n9 @

' q1 u* x) I- @4 a; v& j# q- F Y=因变量4 e6 C' F  x$ `

$ F+ n! c; n: v# P a =斜率2 _% \- b0 z9 b0 K! ^0 J' S& D

* L  g( H$ ^' F x=自变量  e3 N6 G/ Z. _8 x- C

! z. L0 m* I$ o! k7 p b=截距. Y7 h' k6 J+ A$ a4 a
( c1 D* e. {! o. D
a和b可以通过最下化因变量误差的平方和得到(最小二乘法)  [4 t/ ]( K3 P' I1 j  f
1 C+ B, W& m: f1 b3 A: r: R
我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。! d( l% W) r  r& t6 l2 T7 `/ l

1 ~4 D( V% l/ M3 z, ?# I; K4 M. v' T给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
3 l5 u5 T& c- D' K
2 L. {% F( g, P1 V6 a5 H4 D" A! I" G" H# w- K
7 f/ W1 a2 \0 ?( X
线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
. y/ e4 r! q( B& o  G& f: k( {
3 y$ M$ C! a/ P; d拟合多元线性回归的时候,可以利用多项式回归或曲线回归
/ M# I) K: X' q4 D4 Y( u
. q( `" S6 ~+ ]8 AImport Library5 D: [* w* A  @
from sklearn import linear_model
) O& [; M, O$ m8 q6 ]. F4 R1 `
! Q" u5 @" R" @* p( _- ex_train=input_variables_values_training_datasets
3 S; G6 Q& b/ o: ~: P$ {y_train=target_variables_values_training_datasets! }( I" o: u% m1 D! u8 ~' _
x_test=input_variables_values_test_datasets+ K7 f2 o0 Z& H2 t2 M- [- u
4 y# t3 Y5 b$ C
# Create linear regression object
7 f# U( }7 F" C+ _linear = linear_model.LinearRegression()0 O& m9 \$ ^! p4 l3 T, i5 B, L9 R0 p

- a* Z( M% p/ F# Train the model using the training sets and check score
* b& U) o1 W# \7 q4 o& {linear.fit(x_train, y_train), ^3 b, K: n$ D* R& E
linear.score(x_train, y_train)6 I3 }! Z' |- M8 Z+ ~# a$ s
+ g7 }: |7 o" A0 V! N
#Equation coefficient and Intercept
7 D; ?# n+ \( T, @! @print('Coefficient: \n', linear.coef_); v  B. ^5 x7 Y
print('Intercept: \n', linear.intercept_)# z; d0 V( u7 d7 T; o

! p% `5 \5 t3 k2 Y$ K- I6 \6 }#Predict Output
0 l: B2 Y  D$ ]+ Ypredicted= linear.predict(x_test)9 U' B, d5 i* z, }' Z! F
2.逻辑回归
: v/ p# v; y5 h7 D! @6 b逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!$ e! @5 [" h2 N" b% X& `3 q
# q5 |" v, c8 x4 R* B
同样用例子来理解:3 P- G9 j" t, J& q2 |

$ _, c+ z" v! a假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。/ h% {& q: T1 g* t1 B# [! n/ z
9 O* e: r. ^) |" e0 D
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧% q8 P( s3 {/ U  `, w
0 ~! v  k$ _; ^% j4 e3 Q1 Z
最终事件的预测变量的线性组合就是:) I- ?4 h, I( B
, W. ~: `) Z: d9 l3 V7 w
4 [2 D3 M6 F4 }' h: w
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence  c! b. v! P, S5 A
2 R/ M. u1 O. v& f0 _( X( E6 i
ln(odds) = ln(p/(1-p))
+ H8 }+ E2 W/ d( h
0 f% y8 D5 d, Slogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
$ ?4 j- z! Q4 A在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
' b/ V$ x( q: X5 L
3 G/ F8 f% Y  T6 U; \- H% h1 T至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.# a7 A$ i  M4 A8 P& C4 n

7 U' s& X1 z0 K* {
' ^2 L( z3 Z0 V9 e
% G+ [; G3 f7 W/ ~2 V0 H$ C9 @ from sklearn.linear_model import LogisticRegression% S% l7 q4 m1 f
) S& j- H7 b* H$ }3 p
model = LogisticRegression()
, A. j, D: N( U% N" J% [+ O3 ]: P# }4 K$ L5 |- N0 q# W6 F
# Train the model using the training sets and check score
2 g0 t' D6 H% j; i7 o model.fit(X, y)) b$ C. b, Y! [& |! b3 Q4 h
model.score(X, y)
0 f5 T  z( }) p) n4 @3 y5 v( R9 s
#Equation coefficient and Intercept. ^& i. c# e# S
print('Coefficient: \n', model.coef_)2 o, L1 q( ?- R; d. w
print('Intercept: \n', model.intercept_)" Q" {& G' ~+ b: x# L& w

* B! \, T& ?$ F( X  A$ S2 K #Predict Output
0 }% v# ~" k: i! M predicted= model.predict(x_test)
' j+ k* L- B* t2 h  P逻辑回归的优化:
' |6 P; n( E& ^. H( P加入交互项. }) S% X/ b, J. |- k

$ A2 {; h( B% b3 t+ s  减少特征变量& h! n( J! L  U5 E3 J

. [, c& r& P. O1 |$ s  正则化- C6 U" A7 R. K1 v) X

% c9 w1 v& ?. o! C# n  使用非线性模型
/ C2 d8 c9 O7 D, O- `* c  k+ ^
. M$ F  `* H% P( s3 z0 z3.决策树; S! P% e) L  z/ w- s/ v. G$ a
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
/ T5 {" f4 D( H: G& z: d$ q; Y  \1 |# x, G
* V. i+ d, N3 o& S, K- L) Y
- t6 _) U& t7 U' H' {; d' q! w) J( B* b: r1 V+ u! Q2 M5 |
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
0 |0 R6 D0 i1 f/ P
0 `- a* F. C5 x: [: G+ h6 j8 V2 Z
/ b- `. k1 s1 u- k( z' `" e3 `from sklearn import tree
. D5 H( |, u. b6 T% t; M% |* [+ Y/ P  b
7 }0 I+ r% |0 d! ?0 {
# Create tree object ; @4 K5 h' M; F. m+ ^6 z
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  + m1 A! N. K; q  X/ w  U

$ H8 x! Y* U6 [4 Q$ y; B# model = tree.DecisionTreeRegressor() for regression
5 N2 m6 {" t7 P6 \: g* v
+ w  k% Q+ v3 ~, ^' X5 r  V# Train the model using the training sets and check score
  h+ c3 ?! k  Z+ y2 Ymodel.fit(X, y)
) K5 V3 B; t. G- v  I" Q" \model.score(X, y)
& C" s$ q1 @% ^5 O6 z! W* b/ ^
8 H# k3 ?: l9 {' q# }#Predict Output
- g, Q' ], w9 q4 Gpredicted= model.predict(x_test)* x: X" v7 L, q/ C+ _
4. 支持向量机(SVM)
) S5 t  E+ b' o$ x' x这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
' ^, H( t. H& H2 B( l
' Y: y0 n) J0 f2 k  l7 ~% d0 ?现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。& V6 b% }7 W- b, Y0 K* l
) p8 ~: H% l& s  G/ u
7 V! @& S- K: q8 J, U) T/ D
/ E* v5 n& a/ \! q
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。2 H5 n) W+ I" r, I/ v, ]
0 b" z8 |, l0 T  L: N3 |
#Import Library
+ |% f- K, _3 n$ efrom sklearn import svm
. T; [  u; n( L. i# @#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 R5 F0 [# J8 m8 `. S4 S
# Create SVM classification object , Z. z: X9 W" |! y7 \) ~
' ~, L! l  T+ t# w; p
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.2 j* B4 f2 M+ o. b; r
) M- P* E: D) n* @  A
# Train the model using the training sets and check score- Z3 z  B6 D$ g7 d
model.fit(X, y)
' e, y) f: u; t& P# v( |model.score(X, y)- X; U/ ^5 Y; }) q7 j$ r

2 v4 e; e" e; @9 F#Predict Output( e  G4 _! g5 S9 y# `# {
predicted= model.predict(x_test)# M! z( p4 b  G" f
5. 朴素贝叶斯
9 M5 j; O+ H( V9 y" ~" e: A+ |这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。4 L3 B3 S  C+ V! r8 |

) _- ~( L4 `) P* i8 l3 W* V朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
8 d0 b- R0 s4 W( G4 H: R+ p
9 {0 C5 ~; j8 x) L) e% S贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
0 ]7 C5 c# y: }' h. G. \& s! m
( t6 f- o& I9 A, H( ]& l9 e6 p5 `7 K3 _2 {  @4 `
P(c|x)是已知特征x而分类为c的后验概率。5 R0 A- \5 {# o' Z6 e9 t
9 T  c, E) L9 f2 G
P(c)是种类c的先验概率。- {: h9 Y2 V0 U3 ^; B* S
9 A2 y+ r) N# p9 T" F; ?
P(x|c)是种类c具有特征x的可能性。
$ Y" K6 B. e) J+ G0 d
% d/ h5 V; p7 d* T1 u5 XP(x)是特征x的先验概率。
! @9 m; Z+ v) P- m! _7 [9 q; l# \# ]% _  @$ H  |3 h) H8 \5 S
) d* |9 T( J' M& P
例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
, H( g7 ?+ N2 |% E2 s4 U8 n
! @! b. X- j; k2 t- x2 L( Y+ N$ w步骤1:根据已知数据做频率表3 |. F3 Y  u: J

: Q0 [5 S4 ?' {步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
. d# ^9 v/ H" I$ ]2 M* ]7 Z
- q( B& m* L+ u1 W" v
2 |1 V- W' U+ `8 ]6 D. i步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
- o0 n$ Y' V; D& W提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?9 O0 R5 Q/ A5 l3 J) }' W

3 y! U. i) D0 _& |; r. k: e, k我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
- L: D5 ~# R- H- ^+ k6 A8 f" Z
5 _8 Q" d0 t$ v! v3 Y# O) {) P  [这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。, Z/ Z/ }. E" Z7 d
9 p- Y( M5 {7 v. j; a& m2 [# H6 s
那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
( _. l3 e  R/ A, K6 Q0 h! A" n( p" C9 T" F, k: i+ @* b
当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
7 E# h, M; }/ `+ m+ i/ Y# p) H, Y0 M4 R' y4 V0 E. Y
#Import Library
! M' D6 s. C. \6 I, dfrom sklearn.naive_bayes import GaussianNB, Z, R9 O" D1 K# Q
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset$ P4 \, J2 N" W3 p" l  A: I

3 |0 ~1 q) i6 }5 y# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link" H  K4 o4 a8 r
' ^8 \4 a7 Q# z" m% z
# Train the model using the training sets and check score* p2 o6 `, R8 b) E
model.fit(X, y)
" m( _7 A+ q* p# {
$ J9 F0 i7 d) L) K# \#Predict Output( [( W8 @# T0 }/ c* O+ i
predicted= model.predict(x_test)
. Y+ i7 K* m3 l  a6.KNN(K-邻近算法)
# p: s3 _" j4 a' }这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
, _2 P: H; q/ P5 ^' }" R. g1 ^* g7 U6 K! B* K2 P6 @/ w
距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
1 b) [. i- |: m+ f1 O' n" W1 x0 b: t; P9 \3 E# J

$ V6 {% v2 H, T* g3 F2 c$ R2 L! z2 a  p- a0 G' B
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
9 ?; x" x" C+ J% b2 g! ]+ g( H8 }; ~1 l, i2 R; _
在用KNN前你需要考虑到:
- s: o) x/ C/ r# A+ v! g/ `6 x$ V6 O
KNN的计算成本很高1 d& c1 E! j0 @: E4 j6 W5 F6 u! ]7 s7 k
  k  x$ K4 c3 M$ j  ?* A4 l% L- d% t
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
( l( s" z, F: z; f/ }( F
4 y2 z5 e. i5 K& O! Z, y# {在进行KNN前预处理数据,例如去除异常值,噪音等。
7 N* ^& t4 {3 Z& _! R# \0 Z! M  r; `+ I9 P1 R
#Import Library/ T; X/ {+ o6 M4 B$ z' F2 s5 x3 s
from sklearn.neighbors import KNeighborsClassifier
. p" C6 f4 A- _; e9 D2 [9 c2 |8 t/ M1 Q
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
/ \" {$ o, |0 I# y% F4 S* u# Create KNeighbors classifier object model   N& Y7 {( l, j# H& s
& q1 [" I7 k5 J! i
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
& B9 \4 |* w4 Z# m/ F* w3 m6 F* ^" b: M2 n* o
# Train the model using the training sets and check score
  b7 N: c6 V3 @" b. i, smodel.fit(X, y)
2 R% q4 [. \' r2 B, z& u5 u/ V+ @+ e! O. P: G1 G  r- C+ Y
#Predict Output0 n( k- u' K3 r5 I5 y* ?2 R
predicted= model.predict(x_test)+ C. u) j, J/ i$ i' ?4 n
7. K均值算法(K-Means)
; M, q1 u) g4 {$ K2 y8 M这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。2 @) z( L% \9 \6 u

/ I/ u, l0 l; v! s6 X9 N) ]1 ~还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
" Q$ U, ?9 X. }/ W) S. ]& L" ]) M2 N2 H: p! g1 u
3 S: ?& }+ q0 \  y2 n1 y/ V( g
K均值算法如何划分集群:+ `% g* k4 c) a; f6 {# z
$ ]) A1 Z% E  |6 G: n. ^0 t

! d1 @1 v5 e) N9 y, I# q6 q. R$ @3 c! {
从每个集群中选取K个数据点作为质心(centroids)。; ^- `) B$ T/ t" S) m6 T

0 R4 a% k' D: x' T, t  g, J将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。4 m3 V- j8 D  s$ U

. |; H4 p7 O: [" b7 h找出新集群的质心,这样就有了新的质心。
9 s- @: b6 z" d! p' B4 F& N0 N8 D* R
0 e* m# w2 m; e; m7 O4 a重复2和3,直到结果收敛,即不再有新的质心出现。" U" ]" Y% F2 z
; M* S9 V, K2 f0 B; |4 a- f0 w
, ]/ M5 B# ~1 Y  y
怎样确定K的值:) A3 [: Y0 O# _6 X2 J
$ D) o5 L# U$ B* h8 `7 z
如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。/ O" `' T- h1 ~
2 p0 R! x0 j* d( x0 g( B  z
我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。9 \4 S5 p  Q5 l4 N* _4 s1 F/ r

+ Y, l6 ]# }$ A% a
- P9 a2 o% P" k1 z#Import Library
* E4 C; k( P( O+ c' q0 ?: _" k5 o% tfrom sklearn.cluster import KMeans' }& a4 ~' Q  p" C3 l2 _, I
0 Q) W5 q3 g& c: L2 H
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
, C  J  w, r& _* L' o- H2 n# s# Create KNeighbors classifier object model
8 Y1 w8 n* r2 L2 ^k_means = KMeans(n_clusters=3, random_state=0)" D! _: ]1 X5 z

& }8 S# ?; q1 l: D  C# Train the model using the training sets and check score
: p) U# |/ ]8 {7 [& j% }1 ymodel.fit(X)
8 f, H5 }# L1 g- b2 i+ u
# s+ a7 S  @7 ]- k) W. W#Predict Output8 Y* y8 [6 M# X
predicted= model.predict(x_test)
% m5 {* j# }- b" n% A1 ^# h$ W8.随机森林, T$ c/ x1 D+ [$ C: q+ T8 }
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。4 v/ ]4 k9 W  E- t4 e2 |) {' C! ]; H+ B

- m; E* m4 S" Q0 B怎样生成决策树:
( ~) M' C0 W  f; F& g, N: x8 d6 w7 U' S+ N$ X
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。$ g# b0 U4 I  H6 W4 W+ I7 e, e$ t
  i) N* [8 Q% N
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
& `( B5 \  }+ M2 X9 o4 W4 N6 I2 F, T" V8 q: ?9 n
每个决策树都最大程度上进行分割,没有剪枝。
- G6 ?7 x( H$ D% n6 y
7 z  g6 s. q, A( M" `4 a0 F/ U8 v6 e#Import Library* u+ a' E" v& I7 v
from sklearn.ensemble import RandomForestClassifier
" X7 ~: m. h* M3 k- r#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset3 W! S# D9 u* S. _+ {
# l  O- V. _2 c4 _
# Create Random Forest object
0 v* y/ N2 q  i1 mmodel= RandomForestClassifier()
9 }: K5 M3 H2 V- b0 ]7 W. r
) N' u0 q# I* _7 ]! v$ f6 t# Train the model using the training sets and check score5 u/ L+ |. k# w4 c5 ?- M) D
model.fit(X, y)
( g& Q7 Y3 t( }* Z# f9 R
5 t4 V1 Y7 d* Q! j#Predict Output
' s; J2 F2 P' Opredicted= model.predict(x_test)
6 ~+ e- s, o3 M9 A9 P; S( i9.降维算法(Dimensionality Reduction Algorithms)- x4 P9 M# w1 r0 L4 V( ^+ L
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。2 F; N; E4 D+ W5 Z
! U0 p. s& D4 h6 X
例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
6 W* y( _" |# }% J6 O  w6 Q, K' \" i+ {( W* J# k
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。- \4 M+ \$ M2 T, z3 G
' L1 v! V* j" h: R
0 x; K6 ~2 s' R) @
#Import Library
: i& B/ I: t" z+ h# qfrom sklearn import decomposition
( Y  t3 K& x4 _3 u#Assumed you have training and test data set as train and test
. ~) ]2 w% d. y9 B! \. }; q3 y, |$ ?# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
5 g- M" z  N  j# {6 L7 ]. A# For Factor analysis
5 P# U8 t* J7 w5 x#fa= decomposition.FactorAnalysis()  b) S& w" l# R1 E% A5 V/ C
# Reduced the dimension of training dataset using PCA
8 r9 e" O8 @! V2 C
. H. D  l$ z3 v* D$ k% Vtrain_reduced = pca.fit_transform(train)9 Q+ {6 j# J, I! m! x0 v" g
, r" g6 U0 s% N3 _, w
#Reduced the dimension of test dataset0 B9 N7 ^' n) i
test_reduced = pca.transform(test)
& u2 T% F9 y5 i; H: P10.Gradient Boosing 和 AdaBoost
& c1 k( ]) @8 J: p* P# g1 pGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
* N! o  L  d! K! N, h
5 V+ s$ z' ^0 ^5 }  B4 \#Import Library
6 f7 b1 L  Z$ ]from sklearn.ensemble import GradientBoostingClassifier
( c: S8 _4 ]0 K: W# k2 z#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset: e, u, b* N) L2 I$ {! F
# Create Gradient Boosting Classifier object) L5 A1 B$ ?, O2 t* @: ?1 j
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)' r  b6 `5 ]% _, b; u6 ~& f

/ V1 d" q$ i4 [8 w* I# Train the model using the training sets and check score
+ g% `) C& B2 Q! ?+ z! T4 Y; {model.fit(X, y)0 t' m1 E1 g$ K/ _6 d
#Predict Output9 n0 s% j# t& o
predicted= model.predict(x_test)1 K$ m) I) Q/ d4 l" l/ c4 T
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
9 q& E( s1 j* }3 N2 N' w3 b5 p( ]3 ~. b
原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386; d- x! z- W# L; U7 p; f3 o
————————————————$ o+ ~  \3 H; e2 Q
版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 |" K/ H' Q6 r; ~
原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
% h- N& ~, `- ?! X* m2 Z& c1 W. y- c' y" b* i

0 ^$ m' L; I# ^$ x! w




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