数学建模社区-数学中国

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

作者: 杨利霞    时间: 2021-4-9 16:23
标题: 机器学习算法整理(内含代码)
; B+ k: y- M2 `3 i* t; o# W
机器学习算法整理(内含代码)
$ q5 v! ^) Q1 p4 [$ u7 x, [6 h
+ K7 B  A1 O$ f7 S; G. J3 p一般来说,机器学习有三种算法:
1 g) }2 v( Q. k
  E2 H$ ~& z0 H* F! E5 L& k7 y! p1.监督式学习
; H) M0 d! |9 ]- M0 v9 b
9 I0 g& I" `: ~  [8 Q* D1 u 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
' E+ |) A7 e$ G, w5 z( X/ a# G5 P/ D9 D2 A7 M6 R3 R# w- e2 `
属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
+ ^9 x# ?; v$ w2 F2 E& O9 T; d- ?& A8 h! l* x! L3 j6 n
2.无监督式算法3 K' Q9 @$ `- e5 n

8 x0 r5 W' y5 D5 E5 H无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
6 \" T( Q# y9 o# B# m9 Q' }! T/ L8 Y; Q  Y* O" k# G  A2 L& Q5 e
属于无监督式学习的算法有:关联规则,K-means聚类算法等  \& _9 ^" a4 c
/ B8 ?# N7 Y  F/ _, a
3.强化学习
2 }; A: A* B$ l7 P) I0 p7 L1 s% v5 V! g( s% b& s5 u
这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定, s3 l8 |: S( A) V
, r! R8 @& |) m5 [
属于强化学习的算法有:马尔可夫决策过程2 W0 K- R4 f4 y+ R1 L  r+ l

3 z* u0 d+ ^9 Z9 n! e% _& C( b常见的机器学习算法有:
3 O& R% a7 }$ L1 K- b& C$ x% c' p! m! |

  f. t9 x8 s+ R6 B( B1.线性回归 (Linear Regression)
) q" s0 X& q9 X/ \4 s3 U: G
8 Q. D; G  u, i; o* ^3 N; w2.逻辑回归 (Logistic Regression)1 m" U6 M7 Y9 h0 G! H9 {4 O; X+ Q- `

& D/ b# r1 M7 e0 K) S5 c: Y5 s3.决策树 (Decision Tree)
2 t1 `: _1 i' S) i, _  P- O  x1 J  Q
4.支持向量机(SVM)- K: t% y7 b2 T1 ~; E- q  g0 W- s

: X! S# v+ h, G: ~4 g6 D4 ~5 h5.朴素贝叶斯 (Naive Bayes); V5 J$ S! l) @" U$ O

' x! E; z( ~! a3 n3 k6.K邻近算法(KNN)
7 R9 A1 {$ ~9 U4 i) [9 a  S
3 W; ~, ^. G0 D; V; r. H7.K-均值算法(K-means)  j" L( y9 X9 w

) t1 a+ _5 P4 g) ^8.随机森林 (Random Forest)
7 H1 s  o9 y) W3 t; Z  C
8 T0 R. Z5 I' q3 w* Q0 T9.降低维度算法(Dimensionality Reduction Algorithms)
4 ~; f+ s4 k7 w( O
! B+ H. d) V2 O10.Gradient Boost和Adaboost算法/ q; f  P% q0 z% I
一个一个来说:6 H: s3 ]9 G0 V) f
1.线性回归
+ C0 H. ~: N1 |9 X( y/ ?9 I0 N+ p7 s% T+ p! Y9 v4 o
线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
1 s) R8 }* {1 @- W/ l4 _! }- m: K
在这个Y=ax+b这个公式里:
1 D* k/ p4 A, c. C: ?6 ]5 s1 P% P! X( e8 q) w* U. E6 l# d
Y=因变量3 g$ ]8 B! |, u  F  _

3 _1 P4 M, Y# [1 u6 r0 A a =斜率" R  k0 B3 \$ A3 v1 l  J! i
! `3 ]. P: W* w
x=自变量
2 A0 E+ p4 a9 y: L- P2 u3 ~
5 W# {$ C/ a, m7 Y b=截距
, T+ R: t) `5 j6 @* k4 m6 r) Z5 e* O# J; N; e
a和b可以通过最下化因变量误差的平方和得到(最小二乘法)0 @# j( [, ^9 j
# w* N3 Y5 E" _6 u) U
我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
; E( N2 \/ \+ F$ K9 n. n/ P9 ~5 l$ w/ L. \- L
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
5 {% I0 }% O# s6 x5 n
" P6 d% E- n. ~) ^
0 @9 }0 C2 N+ n8 I6 s* N7 r  n3 p; ~0 N4 c
线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
- j4 a7 t1 H% b+ n7 F+ b- d
8 {8 c& l/ r! k7 g4 r拟合多元线性回归的时候,可以利用多项式回归或曲线回归4 x& a! J, p$ U7 s1 H; H9 i

) S1 Z' v, ]. e; _Import Library4 ~6 ^# |4 _5 Q+ k0 Y$ V3 M; ^7 r
from sklearn import linear_model
, N0 m! Q2 d& z' ?$ N0 y' P
/ c+ [2 k# I' o& |+ ?5 F) ox_train=input_variables_values_training_datasets; c) X5 a% F9 f
y_train=target_variables_values_training_datasets( Z0 k( R4 K: d) ]
x_test=input_variables_values_test_datasets
& M$ L( _" P/ \: \& t* s8 t1 s/ z$ v7 x! j4 R- W
# Create linear regression object7 [! c- I+ [  D% d- [: S
linear = linear_model.LinearRegression()9 n( |- M3 D, X$ J4 E% W
  g" E; K1 a: U: W7 J1 O; @. O
# Train the model using the training sets and check score' Z9 t6 `7 v* z; Q" M
linear.fit(x_train, y_train)" G1 L# C8 K0 I. X* E$ |2 e
linear.score(x_train, y_train)
+ j* P0 U7 x: P/ ?3 v3 b1 A6 W  j7 q3 F, u! J2 B
#Equation coefficient and Intercept7 L/ X8 x7 x: R! O* A4 A' M/ W
print('Coefficient: \n', linear.coef_)
9 n  ^1 \! \/ T6 Z- `" u6 d4 Wprint('Intercept: \n', linear.intercept_)$ @* n  J: d+ p" B. d* o, Y2 _7 t

  O0 P& V4 [1 A( h#Predict Output
: c9 L- ?- A; j3 S+ x* `5 opredicted= linear.predict(x_test)
; M, |4 X2 V  m% O3 [2.逻辑回归
/ ^: u, {) K$ Q, ^0 i! v; H% Y( i逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!6 C/ R% X) F) x% ?& O4 ]

4 H- K; w0 `8 `! j5 X# z同样用例子来理解:
1 y2 n2 d* R1 h, B; O2 ]
! W$ F) g" d- y; \+ \假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
/ m3 y' R2 ]1 i% ~9 M! m: ]+ p) T0 I! B) }: ^$ I- w7 G
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
4 D% L% E8 Z  t0 V; M9 X. D# k
) Q% b% ~6 M/ w. k, r: B# I- y最终事件的预测变量的线性组合就是:& w  u0 C/ ?  {" W% r' \

/ W5 ]3 }* ~3 a6 X4 |/ O8 ~. {# t" F; B
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence( a0 z* j' l3 v# a, H2 _

( [9 u+ v; X  aln(odds) = ln(p/(1-p))1 s/ _% q% G0 U; \: i4 L

/ }9 s- i  u: I7 q% P7 glogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
( S$ C, P% c# D/ v在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.. D+ y' b0 Z: d  [* a

' l" C- [5 k0 n( S: Q% p2 o! N至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
) B+ j0 B, ?& {! S, @
7 J6 w  M* a( i8 l
2 x. U. }4 d8 t# F# Y' P! E# `4 [2 p
$ ~& F& k  L5 m  l- { from sklearn.linear_model import LogisticRegression( `: @9 I& w/ p6 \6 ^# D
. y; `2 t. B; k% t
model = LogisticRegression(): Z: [: s. Q. u' ]3 f

8 N2 w2 t1 p+ X  E # Train the model using the training sets and check score* Y# |3 i/ v5 t5 W( ~& _: p
model.fit(X, y)
8 y" q" w4 Y* K! y  j model.score(X, y)
7 J. V) m0 P6 m8 ^7 O7 _5 T1 B7 d0 I2 Y
#Equation coefficient and Intercept! Z$ H5 H: D1 F
print('Coefficient: \n', model.coef_)% J* Q  z9 d; j6 D6 t& g
print('Intercept: \n', model.intercept_)
% P6 S$ g, y; F/ m& [* F5 ?( B+ M* A9 a5 a
#Predict Output
' e( J& X9 f* G% ~% i7 ^ predicted= model.predict(x_test)7 p) c2 C6 l* P/ v8 _
逻辑回归的优化:
6 w$ U# G6 [4 Q$ ~; S8 ~+ W加入交互项" h# e3 h+ o5 \: @$ N, k3 \
7 T; B) U$ ^! K
  减少特征变量
0 P$ X% O: G0 o$ ?
! Y, B: J& n3 U( R  正则化. a4 z  r' N% |  E# \! v

, a9 J( I* D4 w% k$ G( Q. f  使用非线性模型
! b2 n$ |$ {9 [- Y7 k1 ^% D# o/ S1 z* i* }  r0 M8 ~
3.决策树+ H7 G; [7 w1 i1 E( V, _( d: E7 g
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
0 `8 X* [/ b; f* t  D4 Y4 N6 g' C% [' d* {6 u
. u: q7 w' ]9 a
8 P2 o5 I4 A! B& m: ]  l
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。: N5 n) G" Z- u9 h) m! F

4 H( }5 ?1 p3 ]8 F2 Y9 ]  z/ k2 S9 c( S0 k: x
from sklearn import tree, N& ^3 V# E0 Z! p3 }

- y, M* z2 x, K' w5 K/ `+ Z9 A) r- h, O2 [" B9 N
# Create tree object ( Y; \9 b5 H- ~" J1 j+ {$ P
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  ' e5 C4 S$ l1 a

, G: h8 Z) x; i2 U# model = tree.DecisionTreeRegressor() for regression
' L7 W" X# D- T! Y3 ^- h
: Z; U+ z4 ?8 l( x0 g4 q# Train the model using the training sets and check score$ H5 r# {6 V# _) j( e& E- m
model.fit(X, y)
/ y5 u, p2 ?$ z# J% ^  A& zmodel.score(X, y)0 S- M# N' Z9 X! a5 k5 F- C" y% M
6 w& l5 ^5 ^( W- a* o) @8 }
#Predict Output
! g' J5 ]6 w) E- b0 gpredicted= model.predict(x_test)
1 o# X$ _8 Y$ g8 Q; j9 V8 r4. 支持向量机(SVM)
( b2 C2 l! g; C+ I# J1 G这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。  E6 C4 L3 }  [. b* L) ]
; y' I% K4 X: i9 v5 M7 K
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。( l  I5 R) y, `) v8 \
# i; N0 k) W2 J; ]% l# E5 e( w! }
5 [* ~1 {6 Z6 l! T7 r0 ~" s  g

- \! q$ [$ z" k1 L* w在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
, q0 C. m. o9 N* u) U  h" q( r1 |# B2 e) J1 P0 @4 c* s- i" A
#Import Library* b3 b. ]3 O2 f: O
from sklearn import svm
; o% D/ W- G! |2 p#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4 Z1 Z) j5 W5 f/ R. W8 r# Create SVM classification object + H+ a. {/ R) P" K5 c
- N! t( b3 ~) S5 u, }1 Y; p' ^
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
' [5 `; ^) ^2 B3 `* T" \4 e# W4 E  j# f( F
# Train the model using the training sets and check score
8 a/ G" e, ]) N! B4 cmodel.fit(X, y)
7 V9 X& y5 j7 o/ l- w9 _model.score(X, y)& ]5 C$ r: L2 z7 `1 L) W

6 ]7 k1 S" R; o3 A" A  q3 j+ b#Predict Output% h( W  x& C! d- E4 r
predicted= model.predict(x_test)5 z" y/ y0 b" h
5. 朴素贝叶斯
' _$ c6 K$ ~# B& _. V6 {! E7 \这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。" i) r9 Z6 b0 j) @$ c5 C

0 k/ T1 Y+ R/ i) t) a9 Q朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。0 Y6 M- L; g% {0 x1 U; m9 {3 k

" v$ Q. ?9 Q: N贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:  G$ {" \- V5 w- h7 C0 h/ K8 h

% R& ]9 l7 K2 Z1 O- Q, g6 t5 D5 E. Y' B
P(c|x)是已知特征x而分类为c的后验概率。/ U9 c: k( \" K# y6 T
! d8 z3 v, U5 o3 q+ P
P(c)是种类c的先验概率。- ^  s2 x6 V8 U/ Z% Q

5 }( _8 S6 d/ h# H/ qP(x|c)是种类c具有特征x的可能性。8 ^. F  q6 J7 _" ?! U3 a

( d# C" ^9 M  V! DP(x)是特征x的先验概率。5 X# |& x6 p4 u

# `7 w( c# Z2 `4 l8 f* G
# ], N2 K  p# S- h+ N例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
& r4 Q7 [7 H+ v( d  S% g! F. s; {
步骤1:根据已知数据做频率表
* g/ x. Q+ L. L( L3 {4 V; p( K3 B% [$ @) [0 _  x
步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
% Y/ I  f! h$ h  A3 T
! v1 D. y$ C6 c; M$ D3 F6 ^6 O; J4 F& T+ L
步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
# h, e! |" p" Q提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
6 \' E5 V3 |0 L/ o, w1 X( z3 I* ~. Q( q0 l0 M
我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
$ e& H) w, S) M: f# @4 A0 t$ O/ Z& H. H( h" D3 c) t8 N
这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
" z0 H0 Q# l4 E4 s7 h7 l
7 U" d9 z3 i" f$ {那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
0 Q- Q: I( L; q* g$ P5 Q! w7 o3 M( N* c1 Z
当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。+ y5 K7 Z) K5 ?: ~6 a- P* {
! \& n! Z/ ^1 W
#Import Library
$ K4 m9 Z* ~( K( a: U4 x1 }from sklearn.naive_bayes import GaussianNB
7 d: Z4 w+ a& i6 x8 ~# L#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  v9 M/ C& W4 V: P" o  x, g
8 m% l- {1 `; i; h! C$ @# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link6 I6 R3 U% y/ _$ m0 P& U* X

; i6 N8 N5 o7 f3 u0 R# Train the model using the training sets and check score6 B8 S) D- Q/ I* g$ E* R; @! n( c
model.fit(X, y). V; |+ i8 t1 t5 x$ g
0 _& l, X0 b& p1 X
#Predict Output6 E0 u1 K) m* V9 u% [
predicted= model.predict(x_test)
' R, w( {2 L5 i" T. P6.KNN(K-邻近算法)- M3 ~3 g9 B1 y/ D# F
这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
' _# |; C) U. L# \* r/ G; w
7 ?& K' e4 P( ]. r2 k2 _" X5 @距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。, _& f* M& Y& f( u

( H  O' ?' l% J9 F/ W# M! h( Q
# P/ V5 D  Q/ Z7 X% d* M7 R. t8 X/ {3 L
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
9 Q: P  l6 \# I
# T8 H5 u7 U( O1 w7 r在用KNN前你需要考虑到:
8 ~4 z% K# I" z& C  |& m& s6 l
/ [0 y* r: i( M- FKNN的计算成本很高! v3 i8 g. s+ o1 v: R* D, ^
( h7 r$ q" \" _: k) s9 @
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
: {" @2 g' P6 @5 s8 X
; E/ M- L6 O; Q2 `# o* B) j在进行KNN前预处理数据,例如去除异常值,噪音等。
7 D6 S( Y9 h8 Y6 `; i/ ~! W, ~
2 u; r  g$ Y% d3 w, m2 q#Import Library
2 n+ h$ x9 e5 T+ ~# {from sklearn.neighbors import KNeighborsClassifier
4 M; u3 F, G  u0 v2 k& a: R3 B7 h3 K" w5 j0 i8 J
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset  i7 V* h' K& Z- C
# Create KNeighbors classifier object model ' u& n/ Z4 v' z" ]; H

0 ]. w3 M+ @0 IKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5  X& A' n4 x( f- u

2 J) i5 p! {7 M4 b6 b# Train the model using the training sets and check score  v; l+ F# S7 `
model.fit(X, y)
/ g6 S; G* R7 J; @3 \. g( L; E% x2 D# H( D9 `2 ?/ O
#Predict Output  {2 X- ~7 g. H7 F8 ]
predicted= model.predict(x_test)6 h$ G( O- w4 q2 e. x9 Y0 X) M% e
7. K均值算法(K-Means)
: U5 w, e6 e5 S# T这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
8 j/ T- z3 v  B; n0 ~) r" s
9 X' Q) A! n+ C: B  Q5 L还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
6 N! M& p9 H' N& ^& T/ ]0 s, z2 M- n* s. ]) l* a8 k2 a
% R# z. X  e4 Z& l/ h0 c% j
K均值算法如何划分集群:
- r! F# [3 b" o+ B* D- R# a
) n' T0 L' @6 a$ c8 N8 i
0 ^2 x/ W. c4 G8 N5 j/ X+ F. P4 J; t$ X# P9 U
从每个集群中选取K个数据点作为质心(centroids)。6 k9 p# _3 O! K- v5 g: [  S

9 Z% q+ _, |" X9 J4 H4 i! e1 _将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。" O( T% L; p9 E4 B& t/ K1 l# S2 Z

6 ?/ |; W: y  W. f找出新集群的质心,这样就有了新的质心。
$ n. v! m) ^& J# @( L% a1 J6 N
. i$ Z& W0 ^7 m- o8 n重复2和3,直到结果收敛,即不再有新的质心出现。
) X9 ]5 F. l: ]' L& Z* V" j" |. j2 X1 L& ]' X9 k# g& X

: h) f; `! t. d1 q怎样确定K的值:& r! B- H2 }* v' z8 @

! W9 w# Q  m3 \6 \0 p2 }" G) \/ l5 h如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。5 c( w3 l: S( q. O2 ~6 A

$ P  W3 c/ v, Q# E6 O我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
' [4 ?" l0 x9 q; e: `& |/ J! U0 M2 |  J  G5 }4 Z

, p% I. P$ l/ o3 D( w2 X#Import Library" h, n( J0 t  N5 n
from sklearn.cluster import KMeans! \5 a8 Z; F# b1 l- `

. L) N. Z  z  c  |4 a* w( I; }#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset% h0 O# l9 i5 p7 f  k  _
# Create KNeighbors classifier object model
$ u. \* D% X3 U( ]+ F- F8 k( [k_means = KMeans(n_clusters=3, random_state=0)
6 |4 U' x' f! C% u" R6 ^9 k7 T; D1 x- k5 c4 `
# Train the model using the training sets and check score2 C/ c7 f0 y3 H$ P/ r
model.fit(X)
$ p5 K' d. I0 X1 w) g! O/ C5 t8 N
1 L1 L" v! M  T7 F0 v5 R1 [( Y#Predict Output
1 }# U' Q9 Z; b, |3 i( Wpredicted= model.predict(x_test)! f& m5 W4 H5 H' m
8.随机森林
: I: r  Y0 N. z# P' A: B4 z/ J随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
5 k2 e, L3 k# B0 o9 R6 p1 {- @
怎样生成决策树:
9 x  {1 A. m8 X% Q! Z1 u1 v( D1 l
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。, S1 r7 D, {% j4 G0 Z' b8 Y
) d) u( C" b9 A9 x3 b% W
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
8 h; j. c! e$ J) o+ m6 D
# b5 |3 ~) [' B/ z4 y每个决策树都最大程度上进行分割,没有剪枝。% K, @. [) I5 o; M4 L+ ^% u
; |8 I6 d4 B' L6 `8 @' y8 H
#Import Library! Z/ ?  ^: G: ?& A  K$ a9 [! v; }
from sklearn.ensemble import RandomForestClassifier
, B# k, q" [' e) \#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
, a6 X: _) b+ N0 ?2 z5 q4 S- D, ?3 h4 |$ ?. S; y) O
# Create Random Forest object
, w/ h5 J8 ~+ R3 j1 ~model= RandomForestClassifier()! H+ f; c) P! R: j

( C5 ]& P( n7 G5 P* B0 q# Train the model using the training sets and check score
  U& G) }8 o- c9 Q/ Zmodel.fit(X, y)7 ~  t$ k6 r9 t

" C7 a" B1 X& H4 s" ?1 H' e#Predict Output
! N+ T# U3 j; Q! ~; y3 j0 vpredicted= model.predict(x_test): v* B* R- n4 O" a6 J
9.降维算法(Dimensionality Reduction Algorithms)
% g( E4 h4 s; O; s+ p+ g+ V在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
4 Y4 U& h/ {0 F8 V* p) F9 R8 E, e+ E0 Z  Q* c# \7 m
例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。1 Y+ e, j% H8 A, D7 v# R
; h( b# y4 N- Y6 j) T
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
0 @/ N9 R6 h  {$ U' v- H1 s! v! D, L- b$ S% m& c" s' E8 y

' z, Z+ f  X1 d3 h#Import Library0 X& q  G) U5 `  |
from sklearn import decomposition
9 {+ h7 o* d  z; r6 u#Assumed you have training and test data set as train and test7 x3 X: }$ V/ W0 Y
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)% d4 o; E7 p  @  o% w
# For Factor analysis; z7 n: r0 Z- c' U1 ]
#fa= decomposition.FactorAnalysis()
  K, Y* l% d& @1 [2 b0 d' o" k# Reduced the dimension of training dataset using PCA- X- R% J: m/ T( Q
6 o8 ?2 V  |# u% \3 F& O
train_reduced = pca.fit_transform(train)
! @9 d4 ?; o5 t9 w5 M: ~, J( |$ W* {  ~' @# v  X* O- A
#Reduced the dimension of test dataset
# Z# X3 m: Q+ G! h* y! `7 ]) `$ ?' etest_reduced = pca.transform(test)
2 L( m5 v% z3 I1 [, p10.Gradient Boosing 和 AdaBoost
( M2 `/ J1 r2 v9 VGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。$ H0 X# G& c+ ?) r5 [
  N! l  ]' e5 x& I
#Import Library) v. [% |9 e0 G: S2 y" x. S
from sklearn.ensemble import GradientBoostingClassifier
% `1 ^3 G2 P5 {#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
& s, l+ e; {$ S/ [# Create Gradient Boosting Classifier object
3 j' e! E2 P: K2 e2 a; Cmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)7 p2 l' U: {; |6 G; U
9 @4 S9 e* I* v! Z! \& L
# Train the model using the training sets and check score
/ R; g$ O: V4 u" ?( e/ X4 `model.fit(X, y)1 S8 _0 i9 a1 \: U, [
#Predict Output& t; g+ H! a# t$ X" J1 g
predicted= model.predict(x_test); G1 u# T6 l1 w* f
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
- d  m3 H& a  n. Y# {6 ?9 ?0 @- X3 f
. L; y3 j# v; ]6 z$ E9 M8 D. ]原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
. m6 p# ?" S% P————————————————
( A  M+ D0 B' |) A7 R版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: ?1 i( h# n+ |3 @原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
* t# O5 @  h& [9 X/ h- f- ]5 ~
; v3 |$ `; \! b) B2 d
- M! v1 @6 t3 _. k8 W# U3 @




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