QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2230|回复: 0
打印 上一主题 下一主题

机器学习算法整理(内含代码)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 16:23 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    9 E, F. N4 ?0 b$ {
    机器学习算法整理(内含代码)
    5 j" G3 C! }1 O' N, Q2 k, X( A# }8 J- C4 l: ?* H
    一般来说,机器学习有三种算法:
    ! F: P% w6 z+ p8 b9 g/ }
    * h, A$ L* i) k$ u1.监督式学习
    0 p# P$ O1 T1 m) S+ n& G5 W+ L7 b2 i
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    9 j# R9 t4 P" S- I% H- q
    : B; D9 ~" a- a8 K. x属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法% A' ]* y) d: o
    5 X7 W: d* ^+ E% w
    2.无监督式算法, _$ P; j9 ?) a
    4 ~5 o1 H; h# x" q( x
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.! W0 P  d" P* I: f6 v$ b, |! x$ r5 u

    ! k/ }' ~7 N' a! ]5 P属于无监督式学习的算法有:关联规则,K-means聚类算法等7 ~7 r8 |2 P9 }7 K0 `; F

    5 X; ^# H" @7 M6 U1 {3.强化学习
    : ]& x! }6 v8 S7 H" j* k. b. @( M. C! @9 G
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    ' c3 ?/ ^1 {8 ]6 L: k0 r( c4 p7 w8 w$ e& C" Z3 F2 H
    属于强化学习的算法有:马尔可夫决策过程
    - h2 E$ f& s4 O
    9 X+ |( J* K: a2 r! x& \- j( V* e4 r常见的机器学习算法有:4 i* \% S% e/ r3 [0 w7 W- X

    0 p0 t% [  _2 m+ z6 f0 b
    ! C: A, c8 c- f- B' Q, ^1.线性回归 (Linear Regression)
    1 e! R& `) Q2 J! [  y- |* q1 [7 T( [9 _. Y: X, ]+ c
    2.逻辑回归 (Logistic Regression)
    ' u& [: E! q' o' W, j* l5 }9 l7 D( |9 B: J
    3.决策树 (Decision Tree)3 ]! N8 w- p. l
    6 x7 s! s8 Z5 U. X6 A5 Y
    4.支持向量机(SVM)
    ; y* z; H6 X+ d2 v3 l+ R" `7 ?* j2 |5 u, a) C3 p
    5.朴素贝叶斯 (Naive Bayes)
    $ i5 |$ k5 A4 {( P
    2 n8 _& t4 O3 }6.K邻近算法(KNN)
    7 @3 ]  _1 `$ V2 p- s& R( b' n( o
    7.K-均值算法(K-means)
    - W, G# Z) L- y! x8 V5 h
    - v3 F6 o$ d( e  V8.随机森林 (Random Forest)! X- M" N. F0 H3 a; V( ]. _

      ]- p/ [2 K1 x3 V9 F9.降低维度算法(Dimensionality Reduction Algorithms)
    9 i% i1 g+ Q8 y( d. D, |
    7 B* E! V, d6 `0 L10.Gradient Boost和Adaboost算法( z4 M1 @3 O& ]
    一个一个来说:
    2 ^  i- h) ], z1 ]1.线性回归7 M( G# u* c% S) B$ R9 T: {0 U
    % k, L) a: _* i% l
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.( U/ t4 ?3 m$ Q
    0 Y5 H+ N1 V2 `& O$ ]3 d. H
    在这个Y=ax+b这个公式里:
    ' h7 G" O7 E/ G. N7 s0 K
    1 G" Z; F/ g7 ]1 k0 B9 R Y=因变量# {7 S8 q6 J7 F* Z

    7 `2 b$ B8 j3 |- M/ O a =斜率' q0 F6 z5 h7 N; r" [

    ( X% `4 D! z3 d x=自变量" `8 g- I& J2 m. \. T" H, V3 m

    # ^) J8 Q$ O- }- U; x b=截距! T# ~% F& j& ?/ S

    7 u! {) j% \+ f1 j( ~ a和b可以通过最下化因变量误差的平方和得到(最小二乘法)# }6 ~  Q$ }) S

    - Z% o: X# ?' p' }我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    , [, e9 O- B. e* d8 Y% Q* O
    + z; k9 m) O' b# I  t) j' z& L给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    # Q0 S$ n0 \" x! i  L
    : t. r( \8 `+ Q/ i$ Y/ S1 ~  N" I7 e4 j- M' |' ?

    ' y- I6 Z% x" c线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.  U" g2 b0 t0 b8 n' _
    3 B! J; g- D0 y/ ]5 e) k  D3 e
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归" P6 x4 o: K6 }  O' S: q/ d

    " b! {7 R# V  k5 l4 AImport Library
    ( e: D* H+ v4 N- Qfrom sklearn import linear_model1 e0 N* u% ~6 Z) W* V: e
    4 M" c/ F- E* e( S. ?# p9 `0 M( h
    x_train=input_variables_values_training_datasets, Q: @0 d7 @' ~! b7 a" d% [( E
    y_train=target_variables_values_training_datasets
    3 _$ ?; D4 e) g- c$ d6 a6 E% }x_test=input_variables_values_test_datasets
    1 x/ _7 w# g# @) @( R1 z/ @0 U; `4 R8 w7 Z- {& m
    # Create linear regression object) f" V$ k  `- ?& C% G/ x& `6 n9 b, w
    linear = linear_model.LinearRegression()" \! P' C$ T# X6 }# n! E+ {- M
    . t% ~: V% a9 X' S% W+ ?0 ]5 G$ v/ v5 p
    # Train the model using the training sets and check score9 a1 |! ^8 d: z' X
    linear.fit(x_train, y_train)* o- I- M/ V% `3 M2 J0 @
    linear.score(x_train, y_train)
    7 ~1 w! |% y& g8 T4 |, U7 J) R1 V3 Q1 U& o- w2 j! G/ v
    #Equation coefficient and Intercept
    ; W8 v- Y( L: l2 {) K) J7 fprint('Coefficient: \n', linear.coef_)0 Q' S7 F( p- Y" F% O
    print('Intercept: \n', linear.intercept_)
    * l9 z+ D. d+ g# j/ E/ }8 P! f- C7 P  T4 h# B
    #Predict Output- N) F% w/ J& @
    predicted= linear.predict(x_test)! @% l- W* g9 P5 n
    2.逻辑回归3 F  c' q0 k. `7 Q8 |6 r
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!! O5 C5 `8 y2 j0 S

    : M: f7 ~" Q; J1 Q, q2 }同样用例子来理解:
    & S2 M& ^7 k0 H7 D! A. F
    9 I0 |( L; j4 Q: Z, Z- H假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。4 i4 k, N$ u; D% p' u5 x; _( b

    " G* l- L& G7 a6 V& ?6 F数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    : R2 e# x2 R6 j. K
    9 V! |* [$ D: j1 A1 P: t# l9 b& h最终事件的预测变量的线性组合就是:
    + \8 T  o3 \" m/ R& w7 f/ E
    6 `- u, P: u. Y8 A" Z2 L5 g% T# }+ U/ m' s
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence2 c  Y9 V2 s: [5 a3 N; \

    2 I9 V. R9 [( o! i) H: L6 g, Oln(odds) = ln(p/(1-p))
    + h; Z% ?5 u" q- x3 H
    " L/ [1 K: ?- }0 Klogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk( g5 A0 c, r0 P+ U$ D* M
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    " C- P6 R4 P3 I6 L7 Y6 N* p5 q, ~0 {( s
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    2 @6 D+ N0 ?* a6 L  R9 B; Z- i' E/ j' b7 m( i8 ?0 b0 R
      L6 F% ^: x: s8 W" x8 L

    4 {, Y+ H* K" `) s* O: J6 z from sklearn.linear_model import LogisticRegression7 x9 F! D4 n2 H2 u0 D
    : B8 ]: i6 G: e3 L% u) X
    model = LogisticRegression()
    2 b% S" }, E3 J3 |  h- b$ Y. Z5 r( m* ?$ M# q
    # Train the model using the training sets and check score! X7 w/ B0 q" I" {2 i! `6 d7 V9 G
    model.fit(X, y)
    # y# I: D; B8 @; c! v6 g) V7 F; b model.score(X, y). h4 l( L) P! j

    8 \$ d2 f: e1 ]1 }) x4 `& R) f #Equation coefficient and Intercept5 _* o0 q: L; }( d7 K+ j
    print('Coefficient: \n', model.coef_)
    ; S5 n; P6 p) J  J: G2 E print('Intercept: \n', model.intercept_)
    ! Z6 O6 d! a- N5 Z
    ; B. \8 h9 C$ W+ c3 x6 U0 q$ J( P1 r #Predict Output
    / b6 h& K+ a4 |+ P# F predicted= model.predict(x_test)
    # s6 u/ N/ _7 t) D2 [3 M逻辑回归的优化:# L! C' l+ v* v( J- c' ^' W" V; w5 Y
    加入交互项3 e0 S4 c; s# N3 V. a

    ' S7 _7 ^4 u/ l+ \  减少特征变量3 K" y" P! r# K- r2 z; o6 ], ~
    9 C, ~! ^& _9 `% ?
      正则化
    4 N- R( y! m  c& M% K5 @0 W$ X1 M6 s# e- O6 F' B0 @
      使用非线性模型2 p, z0 K' f- I# u

    ' z# F8 g% b1 a( T" `3.决策树
    9 H. c1 [; j5 `* Q5 l: R这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ; m+ [& ]) F0 P1 z. e1 L7 r
    - A+ D5 d2 m. Z# \$ }7 |
    7 n! l4 P& U6 K! E* e- g1 O# w
    ' n$ D  A! @% j2 j8 R+ b从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。/ u3 }4 Y. F4 `8 S6 j

    3 l, w9 ]( M8 J# d# L
    # W' P3 V4 p' D) u- N0 ?" y# p, ffrom sklearn import tree' Q( N3 F) Q; T( r0 M

    % Y3 K# h, ^8 W+ W# A
    1 u* y$ z1 q0 ~! ~1 K( N" D  \# Create tree object - U& d) Q$ o4 e7 n5 a& A2 C7 I
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  9 |  L: r( {3 U. \2 k
    & [% `$ N5 v* ?7 J/ E' F
    # model = tree.DecisionTreeRegressor() for regression
    ; V4 C' h. C8 t: r7 G
    ( w/ k8 T% M' Y  J: Q$ D. J$ y7 F# Train the model using the training sets and check score
    % P! \8 ~7 v! m5 t# L! {model.fit(X, y)- v4 S: Q4 ^  J% `* J% d
    model.score(X, y)( K$ y, U8 Z8 `& O# Z  v2 v* D: q
    ' O8 \" w" E( E' e
    #Predict Output6 P2 g6 j! ~+ l0 t
    predicted= model.predict(x_test)' V) S0 q3 D6 o
    4. 支持向量机(SVM)" i# X* Y* ^6 V" ^. @
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    ; X6 F; V1 l. `$ q* {/ O  O  J7 A4 T$ o3 v0 @; s
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。8 s, U" g1 P  `
    4 ]3 W8 u* h8 G+ G5 a9 e" E
    ! ]) T: _3 e8 a, g
    ( y6 N, F) h( p9 h; C) p5 F
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。0 \3 F8 D8 x/ h$ }0 Z

    & L5 G. X9 E5 g8 y/ F+ r! F. f#Import Library
    ! ]7 {1 ?' K- ^1 k* H( Zfrom sklearn import svm& n3 O7 o( n7 n
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset+ d& m; K* o7 \, N
    # Create SVM classification object 9 o. n6 G' U# c* z& |! ]

    & f6 }1 J& N: `0 @' {model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.* ^+ u+ v/ Z# K* K* X3 M0 m: {
    - [5 d  }" k, F6 f
    # Train the model using the training sets and check score( Q, Q1 G6 W3 i: \
    model.fit(X, y)
    8 i; `% _$ Z/ v  P  d2 |6 smodel.score(X, y), w9 T, S# o( {4 Q8 C

    . s# ?4 [! u. B# k% X% ^' E#Predict Output
    * w: B2 C3 D: v' Y$ _& Bpredicted= model.predict(x_test)
    ; d6 @! p/ t0 i% D# ^5. 朴素贝叶斯
    ! h) M  R. H' I0 l; f/ P2 E! g- g这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。9 i3 G) Z( e7 d. S

      [" r$ X$ A8 B. c. [; u朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    + M( P& V0 l1 t" S- T
      g; n+ O  l" ^) M3 b/ W贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:  ~1 `# d, I) w" `0 {/ q9 B
    / R9 P8 G5 q2 F9 N9 e

    * B* a7 N  Z+ J2 XP(c|x)是已知特征x而分类为c的后验概率。
    5 \8 I  ^9 s1 \
    ) ?% V/ \- I2 s( m) S6 UP(c)是种类c的先验概率。
    " ]1 |  K% z0 r. g/ m' r3 d0 q- U3 y
    P(x|c)是种类c具有特征x的可能性。8 e# g+ d$ X7 A, M4 v* K6 `  B
    # e* s1 E: h, f8 z) V" Y6 ]  m
    P(x)是特征x的先验概率。
    3 z, f5 _2 O% Y; Q7 @( {0 p/ X. O- `, [6 q
    % N/ [! d- Y/ ]7 v6 t
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    ( V5 g: S* E9 P' N  `4 M: o
    . b! z' I6 y. i6 u! B步骤1:根据已知数据做频率表4 P' `* Q( x; q" {2 j4 Y8 p

    0 g- x! f1 k$ C) c2 o步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    ! g9 v. m( W  L) f, {( l
    ) j( W" d* `/ f: V  ?9 k1 ^( N. b$ U6 j! S# ?) V  H
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    4 {9 U# j7 c4 w* Y1 ~2 r$ `) Q提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    6 E# }4 }7 V' L6 o- `& W0 M7 F; H. s, F# r
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    1 J) @7 t8 Y1 {5 E. U/ q/ e
    % N" F( \+ B9 [) d- o这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    " K# k- U4 j: U' f, z7 `" L
    7 g( M3 o9 H- v' t# x那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    & G. H# V7 V) w1 u5 f' s+ z9 z, @
    ) w9 h: g+ o( C1 a8 A6 p9 u, M当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    7 U2 i' T$ g9 u. a) [9 n2 K9 Y" a* o- l+ u1 n
    #Import Library& V3 t1 X' ]5 Z' s6 c7 t% D
    from sklearn.naive_bayes import GaussianNB- B$ X1 T& O: W% R  h
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset  @: n. X; w+ g- m$ l
    / t6 K# c5 D" g, w
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    ) W8 U, r. W% H' n- f4 g
    % k% Z* Q+ @! Q# Train the model using the training sets and check score
    3 \% r% j8 `9 t) R: V7 F' fmodel.fit(X, y)) I! m" ^, D2 d3 l$ U% o0 g  Y

    9 P. X3 q$ W5 K3 ?0 t#Predict Output) _* \; O% z& h0 O
    predicted= model.predict(x_test)# [# N) w4 m; L- v* j5 J4 N
    6.KNN(K-邻近算法)8 h% ^  O2 t; F$ G- V  O" P
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。  p. q8 M- f8 f/ g7 d( _  l

    1 E/ y# o: V; ?4 }5 M; j距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。) Q  G+ J  g; b" M
    2 }. e6 t' p0 `1 }9 r4 e  c8 a0 o
    9 B, x) u- T3 T$ s
    , K& N$ g" C+ h. A2 f5 T
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。2 A- Z' h; p6 _, T

    . w+ \* m% b) R/ s9 o在用KNN前你需要考虑到:$ }0 z7 ~0 q( a5 `  @

    / D" n$ ^% Z" c/ ?9 [KNN的计算成本很高0 X5 n) _- W/ N  a# o# _0 b. \* Z6 V
    ' D6 ^. t: E" \6 e0 i. o
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。! T5 g! t8 a, G
    / f. r  T; u+ s6 Y* b+ n) p. Z% c: P
    在进行KNN前预处理数据,例如去除异常值,噪音等。. ~) w+ A* q, @4 U% H( x3 A/ @

    % M( G% v" T% @. D8 I#Import Library4 b' R! e# V  `9 y% K9 g: L, m9 y6 i
    from sklearn.neighbors import KNeighborsClassifier
    ' g" Y( K8 x" Y$ J+ |
    7 P+ K+ F" x( }0 J  P#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset/ b5 u% h9 i* c  w
    # Create KNeighbors classifier object model
    9 U1 Q" B6 |. Y1 i: _8 ~2 Z# m- }9 a) n& P7 S
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    & i2 d! q( D7 ], q( d8 N1 t+ r4 D/ v- ^
    # Train the model using the training sets and check score
      R4 _$ E. c5 }/ }$ ^9 t6 R3 K: rmodel.fit(X, y)
    ' r2 a$ r  w" [6 T1 Z4 c. a9 l7 i; A" L8 R
    #Predict Output
    % f' o" B8 ]: I1 c0 `& q  m+ j/ _+ {predicted= model.predict(x_test)5 ?3 C# u% h" Z8 w. E
    7. K均值算法(K-Means)
    0 c" F! w1 e& U; b& i这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。6 y' |5 {3 @' q0 l$ x# d4 o" [
    ( l: J5 ?3 t; a' F# y9 m: R8 W5 t
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    - h$ c+ i, g+ ~  \4 z) J" G/ k0 i3 R( a* M- h. n0 O  c
    + S* s& D6 Y2 b) k6 {
    K均值算法如何划分集群:- [( ^" J, M( M  b7 k- ^

    - V  V6 V% S/ \5 L1 b
    5 m( f3 o- r. E8 O/ p2 v, ]% Z
    2 l; w+ g# Q: K* K; l$ r从每个集群中选取K个数据点作为质心(centroids)。7 \4 b. ^  E" t0 M, x+ X) j  w
    ! ^. c3 w: O/ v9 U/ r
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    6 x7 [& n- @2 ]; z
      o) x  w# y/ t找出新集群的质心,这样就有了新的质心。) g0 h0 r# ^  `5 Z

    5 M! z2 [! b& T1 x5 Z6 v重复2和3,直到结果收敛,即不再有新的质心出现。
    9 f& S: b' V+ ]6 R8 t  V
    0 Z; C8 a( ^' Z8 I3 m; ^
      t+ d# O+ x( h( U# \怎样确定K的值:
    * b2 u" o; {) `7 P  \: h+ O) W" ^1 X, c
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。2 T- a# o$ z2 J& z' m/ D' v

    5 t% ~5 z" s' `1 b$ `: U我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    : V0 M- W/ G0 F7 g: f% N6 l6 n4 x/ R, g* q  j9 L0 a
    6 V; }1 F% T# S' b1 ^
    #Import Library" @7 Q, Q; O, `' [8 E: B( @+ p/ B
    from sklearn.cluster import KMeans5 o& N4 y' \7 X9 b5 P
    - C: I+ c3 j7 J. }3 d9 p
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    - [5 Z3 E$ w7 Y& k8 o& H# Create KNeighbors classifier object model
    5 F- Z% C, f0 H& Tk_means = KMeans(n_clusters=3, random_state=0)
    8 l4 C( @. H2 }
    " V* _# D5 U$ n8 B# M# Train the model using the training sets and check score" D7 D& w1 ?1 {5 U
    model.fit(X)
    / E  k8 w, m6 T8 y8 J  `! O7 \$ \/ \6 G
    #Predict Output
    6 J+ ^4 k' p+ b% M- Xpredicted= model.predict(x_test)
    9 ?# @$ Z, ~* H# s5 h8.随机森林  L! F7 A. Q+ [: h7 J$ W1 L1 V
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    " P$ j6 O) D0 Q
    8 G- ?" Y7 Y) `" K9 n1 f怎样生成决策树:
    ; }% P, h. {1 [* Z' p4 M: G" y% I" H$ N7 a! A6 _6 w
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。+ c: `' N+ C- b+ l$ z" l3 v

    8 f2 W: F5 ?) `) W8 p/ m如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。# J4 V0 \( `, d- b' x

    * V6 K( U7 @8 z/ R7 u" T* B$ [每个决策树都最大程度上进行分割,没有剪枝。! X5 M2 m; @. F1 f
    $ x  N) q( T0 r
    #Import Library" f( l% r$ x" T- U7 V* |- C
    from sklearn.ensemble import RandomForestClassifier( q, w# q( H$ ~+ C$ F. e3 @" z
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset+ [0 U- J/ a- Y% E/ Z- G2 J
    5 I' X- e( C2 f
    # Create Random Forest object2 f0 U; U- ^! g& A1 H4 |* R/ b
    model= RandomForestClassifier()
    8 Z7 L& B1 Z) N7 I: I0 c1 t
    : X# I# L3 Q- b3 B, G! d# Train the model using the training sets and check score* c& k: y; T8 L$ i, N" i) P1 O' c( Z
    model.fit(X, y)
    : t/ t0 u/ A: _! L( z
    # Y, I1 h$ U) n#Predict Output
    # C: u. X1 F/ ?& p4 K) A7 v7 Rpredicted= model.predict(x_test)
    2 L2 ]1 H: e* o4 Y9.降维算法(Dimensionality Reduction Algorithms)6 d4 L2 [* j7 r
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。6 ]& Z8 d4 I* c. x- e

    4 [$ k0 K( n# A: o1 Y例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    # h. U: x4 J8 ^) b0 w' N, e. y2 Y$ x6 M+ e3 J/ E1 g# X8 U  z0 N
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    : N2 d) v3 }! e9 n1 q, [' Y7 s0 W9 u. W- d' d# O( u
    8 o- X6 K. `  I8 g+ C* f1 ~: a% ?
    #Import Library
    6 P8 P) t% G) W7 d) K- B% ^from sklearn import decomposition
    6 ]( u+ P- T( y0 k. F. [/ E. h: @#Assumed you have training and test data set as train and test9 V8 S0 T5 ]1 P
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)! p4 o' g& s  _  q
    # For Factor analysis
    " ]' M- k, _# T# Z#fa= decomposition.FactorAnalysis()) s6 m# t+ U0 m1 x
    # Reduced the dimension of training dataset using PCA8 f$ W; n* L! Y% d

    6 p0 p: H/ |  R. Wtrain_reduced = pca.fit_transform(train)
    8 G! l( `& Y; r& C4 V* ^* _& h+ A* t
    #Reduced the dimension of test dataset1 J$ m5 E0 ]0 D# l
    test_reduced = pca.transform(test)
    . t/ ^- @1 r+ S5 r4 D7 f9 s10.Gradient Boosing 和 AdaBoost
    ; X8 ~0 `# g) b( m1 BGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    ) {; ^4 H; k4 c2 P/ I3 D( |
    * g( X! w! h* K; c" S- T5 X#Import Library* V0 X2 v. N& C; O$ O. U; H
    from sklearn.ensemble import GradientBoostingClassifier( B" M# ~$ n! ~
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset; Y2 K# c# g( R$ Q4 f- J  a
    # Create Gradient Boosting Classifier object
    : z+ N/ [3 G5 h8 Qmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    $ _! I* |1 z$ n$ Y0 M2 s: p/ K' w- }* F- G1 r
    # Train the model using the training sets and check score, f" e; }1 C$ h
    model.fit(X, y)( }" X; x5 o6 W# H3 A4 i+ C: c4 Z
    #Predict Output
    ( l7 {1 B3 d" ^7 D1 N! h) Upredicted= model.predict(x_test)+ I6 {# U4 w; y7 K0 F
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    / U! S/ @8 C) I- @  z( I: a: B" o7 X9 b; t) E6 U+ T1 }
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    + G4 x, n" h5 T9 b$ Q8 I5 {. ?————————————————
    : o- M% l1 W: O版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* n0 ^$ P+ j  Q
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    - Q! M2 Y! s0 q! {; l" |  q1 U9 A4 U) i+ N% i1 t
    6 b, B9 P/ u) P; P) F; n
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对2 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-24 22:50 , Processed in 0.625199 second(s), 51 queries .

    回顶部