QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2208|回复: 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

    2 G( [- Y" T6 [5 A8 c$ J2 A3 r机器学习算法整理(内含代码)1 H3 F  y# }9 Q+ \" ~3 N

    / s* C/ C. U& P3 B一般来说,机器学习有三种算法:
    8 h) X% I* K' F; G; N/ g
    + |8 Y$ ]3 J% G1 g1.监督式学习& G, f. [% R7 D  H3 V4 m
    ! N5 k% B: p/ }+ n( L( |% `6 x
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率" M* r" w- O6 L, @5 E' \& M
    3 e  Z, P5 s+ k4 W  S: ~
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法9 e) n* U9 f4 n- l4 E8 {! p

    / g$ C8 I8 O7 A, _; d4 L2.无监督式算法
      _" a0 A0 }9 ^5 y2 N  E5 r  O. t; T6 k* s8 e% f- [9 e
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.+ V7 n! G' U/ ~
    , B7 P8 G1 t4 x5 @/ ^
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    1 z- G0 c: O  }' r; a" ]
    1 a1 E4 z+ E7 w5 C& _" `! B# H3.强化学习# Y. u* {0 Q3 |$ L8 e

    + u/ D- _/ W0 I* ~% G- Q2 C这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    . D; X6 H5 `, q' x' M/ W4 T! i0 q+ x( H; g
    属于强化学习的算法有:马尔可夫决策过程7 O5 R9 e, i9 V0 [* R9 D2 e' y# A7 F

    ) O5 t- q6 k$ o/ _常见的机器学习算法有:
    * B; f$ @) r1 P6 e9 `
    ! e, N1 Z3 W2 O
    . t* g! w* e7 ~8 M1.线性回归 (Linear Regression)# [$ [8 S2 s# O+ P* x& b( U

    9 G8 g! S/ W5 p0 x2.逻辑回归 (Logistic Regression)( W# H+ N& P4 k+ |
    7 ~6 U" M6 R! F' S: I- c9 V) O
    3.决策树 (Decision Tree)
    & N. i; c/ ?$ J9 v
    4 Q% {! J( J" _  _$ Z4.支持向量机(SVM)) N4 N# ]1 n: L

    ! `; W% j9 U1 ]; B% U, p* a5.朴素贝叶斯 (Naive Bayes)
    ! q, l$ p, Y$ r+ y  a7 }
    - c) z9 o7 i4 v8 u3 Q$ D; E; P6.K邻近算法(KNN)+ s. K4 _7 z5 Z& W# U7 C

    7 C" B! I% o! y1 {  D- \/ F7.K-均值算法(K-means)2 F6 L3 T# {) ]4 M/ V
    2 L: f0 Q+ I; f. s9 T7 u( P# F
    8.随机森林 (Random Forest)
    ; c$ z& ~/ l( d5 v* f5 ^
    " L! O: E  k% f9.降低维度算法(Dimensionality Reduction Algorithms)
    , M- Z1 n# Q) t4 K  [6 [* V" s4 ?5 }7 V3 p
    10.Gradient Boost和Adaboost算法
    - z) ~0 Q; U! y* G9 F一个一个来说:7 g$ V6 F& v1 K
    1.线性回归8 Z2 w) [, w8 U) n3 m; B
    8 q! ^5 ]  H" w$ t7 D" ~
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    5 V; y. U9 H6 k! f; \$ m; F  C6 k1 N7 h
    在这个Y=ax+b这个公式里:, v9 j, ?& A- Z: o  Q) Q
    ) Y" o7 c  I2 ?" q
    Y=因变量
      Z  A, V& c, e
    5 U! p8 T- x: ~; y4 L a =斜率; P. }$ ^) w! Y- v1 N3 m' `$ T
    + k7 \0 f5 P4 F& I+ }- o
    x=自变量
    & E4 C) C2 V1 y9 E1 u6 ~- G. @$ N5 J/ s6 |9 g$ i
    b=截距
    7 J: e# t  n, o, H
    : l1 s* t4 T5 s: ~1 j a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    7 v* @' d0 [! F9 E
    $ N- m, c, @  S' t0 l9 w+ ^我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    * ]7 o) H/ I4 n8 y  T, S2 |9 J) {5 j- \+ a3 J9 U
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    3 f( ]' I0 {6 b& w6 D% N' v, N) J3 |
    9 h8 O1 _8 J6 W
    7 F; |# g6 p; h5 b6 x
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.: y1 T' o% M7 f; E0 G4 Y6 N

    $ M$ _/ g! Q) g; |: w( c拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    9 U% J- H. F  I, Q# l4 t7 z% a/ S) B5 m
    Import Library
    ! [) g) f% W% v6 B2 s9 p. e: \from sklearn import linear_model
    : L- j+ n( a. C5 @- \" C3 h& a% d" ]
    x_train=input_variables_values_training_datasets
    % v* N) L" L; f. `y_train=target_variables_values_training_datasets: X% Z! x: M; e* J
    x_test=input_variables_values_test_datasets
    2 u( X7 }' J4 s' |, ]
    2 R8 m( X8 |7 J( |$ [# Create linear regression object5 T. @3 ?- d- n2 {% O' O7 ]
    linear = linear_model.LinearRegression()7 I( Q' n( R$ E' w4 W' p; L

    : s% N2 T, ^' A" e) v% Q! O# Train the model using the training sets and check score
    8 ~9 }  z" ~; O6 {7 Vlinear.fit(x_train, y_train)* J, H/ h- u  S5 i
    linear.score(x_train, y_train)
    / L$ E7 u: [7 g0 g$ r) g/ H, W0 w& w! f9 j$ p6 ?/ T' h
    #Equation coefficient and Intercept* G$ n, S, I) U9 k) @/ `
    print('Coefficient: \n', linear.coef_)& i) u9 P6 x( c  o8 m) t6 x: U4 Q# c
    print('Intercept: \n', linear.intercept_)
    " b% z7 S- {) m/ t
    6 q7 R* m! g: N5 c6 E#Predict Output
    & r( Z6 i4 e9 _0 \; Wpredicted= linear.predict(x_test)% ?3 o4 ~% e) Q  f* I
    2.逻辑回归: B' l$ c* L$ _- k- N* H* D
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    8 [/ j: O# ^) j( T9 L$ c
    , F' P; I1 D1 x; f, W6 {1 A同样用例子来理解:
    * n8 _1 `- e- h; B4 Y! P# Y, u
    " X5 K8 }7 o! U2 z9 e假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。0 k, i" ?3 w, S: u" q
    1 d5 N1 i! r1 O0 B3 e- c
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧. \0 N" }8 a& M
    ! B9 L* `% O) X% F8 ]# @
    最终事件的预测变量的线性组合就是:
    5 Z2 \: x9 X& C& y: N
    " u. M. g" ~: w  \5 J' g+ F" G1 d* Q! s* l' n& W( L) |( ?8 k
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence6 R+ A- a) H: O

    9 Y) d* A: s% V; h: Z0 m2 N/ Z$ Lln(odds) = ln(p/(1-p))
    0 F$ W* s' T& B8 Y$ t
      {! l" ]8 E- X  ^. r: W7 [logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    3 q! T. H+ _6 O' y2 z% F) }在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和." i$ n. ~1 j$ X5 Y6 I) B

    ! m+ L# a4 \/ w4 Q# f" [: W$ U' {至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    + w4 J0 f- _2 r* |! W6 q/ ?9 F. m: {' ~# a

    $ u; S' ?9 S% T3 K2 S+ c4 m! e" ?" E) t1 P* l( N/ a
    from sklearn.linear_model import LogisticRegression( S: X: t% G( ?/ `) R

    8 N5 w; J' ^( J0 I! d model = LogisticRegression()
    1 [9 p3 u6 X/ x8 X% a( g/ B2 ]$ P5 _" Q, y0 [9 F: M/ z
    # Train the model using the training sets and check score
    ' m' y, O3 u+ V model.fit(X, y)
    # t  C: V7 i! e( \- r' Z model.score(X, y)" s% e4 h/ U* T; `

    3 l* P& r: d9 s/ y6 Y #Equation coefficient and Intercept4 P: t5 I9 ^' V6 X' [
    print('Coefficient: \n', model.coef_)
    1 T0 H, ]" s4 r print('Intercept: \n', model.intercept_)
    * I) J3 a0 ~1 H1 f0 ~, r. h4 T* U' g1 j: m& k6 g$ b
    #Predict Output9 T' t; ]: K# _- ^( i9 Q: f
    predicted= model.predict(x_test)1 C: g% J; k" j8 {
    逻辑回归的优化:
    0 h5 c* J! c* x加入交互项" J9 A; T& s+ P4 _" z; z

    , |3 G: F; X6 x  减少特征变量3 v% [: \" z2 p4 D7 B& a
    5 A4 f3 T5 t; Y/ H
      正则化9 _6 k) |( v1 P$ Z( b
    + Q, x" E7 R& s$ C* h
      使用非线性模型
    / u' ?& ^' z6 U. `$ X0 T4 |) P$ i
    3.决策树
    7 Z2 P0 R4 T. l7 i. b9 E. F这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。9 q1 Q" H& V* G, b/ l+ ^9 {

    , P, ~" X. g  P8 X- n. ?
      K; j, l3 o# n# v
    " g* S$ V: _8 r+ J. g: _9 ^$ `7 P从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。+ x" S  |. m( X0 l5 Q: E( }

      P5 r5 ?. N$ p$ Q
    ) B* y) v$ |6 b% J, c- Jfrom sklearn import tree# Z/ d' y- ?+ }0 H" [  L& B

    0 c4 J$ W" V% I. B+ B
    & \4 P' i2 R/ y/ r! l, T6 g# Create tree object + C. s" T+ ]: Q* R1 O
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    1 r! H; H# |; B' C- W" d. i" Z4 G8 Q6 U9 h" p4 ~
    # model = tree.DecisionTreeRegressor() for regression
    ( ~. V9 Y1 V: F7 _9 t
    ) s) M, T, ]! N: Y3 r  C8 @# Train the model using the training sets and check score
    ( q/ r1 b& D4 G8 I/ Y! Kmodel.fit(X, y)3 i! |: W0 a3 }3 q1 {# Q; o3 V
    model.score(X, y)! l+ C- I: ?# O" P9 s

    . ?* O$ |, W) m# O; l" k% {#Predict Output
    ( }- w  T) p9 F# [1 S4 p* S9 R0 D- Xpredicted= model.predict(x_test)3 B2 u4 U& r5 W% h9 }4 L3 ^
    4. 支持向量机(SVM)
    + |5 ]3 J2 p$ ^! P6 Z这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
      m+ V: C7 z/ Q$ j2 c' U) `/ o# s0 \8 R1 w4 @! G  ~' e
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    6 \& a9 @, X9 i- J  d) f3 F# R1 R: }' x7 Z! T

      m7 K, i0 Z* B) ~6 G, `
    , s4 n; x% k% T/ J& Q3 L  o在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    9 C4 ]2 C& w1 A- G
    3 |% @* k6 l4 s* M1 C6 Q4 s3 N$ X#Import Library
    ; j" t: j% S( d- ^. bfrom sklearn import svm' b& _1 _8 z! g0 {$ C
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset1 [2 v) G; ]3 D6 x# v
    # Create SVM classification object
    % p) \0 e7 ^  q* P$ A  i+ {% w4 F- o5 }- `) A7 r2 s6 K( e' ~6 `
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.+ W$ @: |" X; Y4 x1 A
    , O# w: X/ L- U9 m6 q3 I
    # Train the model using the training sets and check score
    . |+ `* w4 r  F9 M8 f9 d, imodel.fit(X, y)
    2 g9 o- R' \2 T# ^model.score(X, y)
    ' S; S% U5 h/ M0 |4 e9 j$ d9 B/ K$ Y2 \% i- z# B  k5 E
    #Predict Output
    $ h1 b3 `: q3 D- [% f: B3 Qpredicted= model.predict(x_test)0 d* R- L1 v* l0 B
    5. 朴素贝叶斯6 }- D8 |# f3 r' L
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    " b" ?$ {; |3 \) }. H
    ( F6 j8 O9 X* H+ _) C* D5 Y朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    % h+ [9 X4 b. c+ ?6 N/ A; k1 x9 I  V4 s+ [$ B) o
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    * U' v6 J& e0 K
    ' Z4 a; z. x1 h) N, S, W  D4 b. B" _5 Y  r
    P(c|x)是已知特征x而分类为c的后验概率。! Q3 P& B) K: e& w% i- R( s1 g
    . ?* r& [+ n7 W
    P(c)是种类c的先验概率。& I1 o: f1 K) I$ h4 t/ L' |+ z

    " {1 C' ^/ a3 H, U# R8 EP(x|c)是种类c具有特征x的可能性。
    4 f+ b% f2 L" N/ }1 [5 D3 B& \# x& H! P6 s4 D
    P(x)是特征x的先验概率。
    " u; T! h: O: m7 k' G- A2 X& L+ K* q# R: m$ A( m
    1 x! r# P9 @8 t) o$ z. n
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:+ C2 q( C6 O+ C' C

    + d/ c% e( L" Y& B" G/ \步骤1:根据已知数据做频率表
    , z" R, s5 w* J# G% j0 ^# B$ a! L1 g) j  ~- Q' k
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    , \1 x- T8 G1 p- q& b0 q# \- r; W: S" C/ b+ F- L
    ; f9 F( V. ~, C" B7 {$ ~
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
      C; c, Q( @& P; e( q8 v& E8 [提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    5 n+ J0 F7 y8 Q4 r, p  P. Z4 i, t6 f% y- Y$ Z0 y' l& O& E
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    " m; G; q- u+ V- b& a9 P+ t3 |6 h/ d: W# r" Z  E2 H
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。9 F9 d3 N1 `$ K0 p: a# C* d

    1 E0 p/ h! p9 w) M& l- K( l1 P$ Q那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。  v$ X& z, _9 Q' I, H
    ) \+ N! S6 M+ X' o' ?
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。5 n' b5 I3 |2 M; G) C( E
    8 ?( N' |7 A1 G- s3 L' ?+ h
    #Import Library+ \. d5 k: r9 a) M+ Y3 @
    from sklearn.naive_bayes import GaussianNB
    ; p2 O  n# g6 w#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset" m: v/ R3 e: {  L  _+ C+ X
    6 |! M- n, L  S/ \! V3 F+ C* q. D( K
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link5 j5 o( J1 E/ y/ G/ j+ M, w( [: W

    2 d% c6 T* B8 f# Train the model using the training sets and check score
    1 }* y: G& p8 Zmodel.fit(X, y)( q. l' X* O" j, d+ a" O$ X
    : ]- Y) X. z" l; Y+ @* z
    #Predict Output
    : ^) }# `" ^& q& `& hpredicted= model.predict(x_test)0 o) ^' \/ r8 T. `3 R
    6.KNN(K-邻近算法)
    " ~' u( Y8 K+ N这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    " m; S4 n6 u! X6 x  Z9 F# l3 S6 H4 B, H' e3 o7 Z+ a0 E$ ]
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    ( q7 L9 n" Y0 y: ~; d
    , Y. ]! I1 G* B2 w/ C( s/ q0 a; h
    : Z1 g6 D0 P' Q
    5 G  M1 K& g, jKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。9 g9 T0 \9 p9 ~7 n9 _* @% N

    ) m$ e& x4 Z' [! Z  l在用KNN前你需要考虑到:- j5 z! g( r" ?

    5 o: U; W" N1 X! H, ^+ G+ I+ C* @KNN的计算成本很高
    ; ]3 K/ g* U- H# M: V# [
    4 w/ I  o9 v+ T% O' X& d" ^; X- r! W所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    1 i9 `! h0 r! v1 q8 `; i
    5 V6 S* k6 U6 y0 g在进行KNN前预处理数据,例如去除异常值,噪音等。
    , p- n% N% S: `" ?6 s4 @& Q8 t- t  i! {8 e& D4 H" I% Y- {# e/ ?
    #Import Library
    1 h& j( r0 H0 s8 a/ i* jfrom sklearn.neighbors import KNeighborsClassifier& {7 q; A- T& M- s; ^
    ; D, `& Z0 S4 ~
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset( Y5 M/ a. \& _$ N  _! p1 d0 l0 O3 K
    # Create KNeighbors classifier object model   i6 j* Q* U+ X5 t' [/ ^; b

    # L1 M2 k& Y* H! C: HKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    : P. k2 @5 }) z+ U; e" S
    , A$ m; Y( U' u4 K: b: z9 v# Train the model using the training sets and check score  H. X/ {' z1 s8 C  {9 \+ y
    model.fit(X, y)0 H. S! Z3 k$ a3 l- G

    $ e6 N+ G- g: `0 n# u' Y4 ^7 r#Predict Output
    3 m, W$ Z  ]/ xpredicted= model.predict(x_test)6 T- k1 M: M9 _1 v" |
    7. K均值算法(K-Means)- `* b8 L! E: q: H# Q9 k
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    9 j: U7 E# U% b6 O  c# C! a: `; s6 X6 }7 U) G$ D2 Q
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    ! `+ |" {. E, g
    , F9 i5 ~! a; h+ u- f6 G
    ' C8 d' V! I6 B! B7 D! ^3 RK均值算法如何划分集群:' S) S# [$ |% N" c+ }8 v4 D1 u
    " k/ ~# g) }8 d8 S7 V' X  G8 n+ d

    8 w' t- c3 J8 C3 g  H
    1 R& \$ ^+ X3 A+ V% v4 _9 X从每个集群中选取K个数据点作为质心(centroids)。
    / h4 C. |& g' j7 g0 h4 z0 G1 p. g; P* i8 b. F; t% Z: E. Q2 ?
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    $ _; F: J: ~, s! ~4 C" z) N; K. J  R/ h3 j' B
    找出新集群的质心,这样就有了新的质心。
    ; L+ |  H& V0 z4 d% O, V# o- Z% c
    重复2和3,直到结果收敛,即不再有新的质心出现。
    9 w% `9 A! |, ^/ ?/ }1 {8 ~) E( Z! j' M( a/ w

    $ B* F: |3 O5 `+ Z8 i怎样确定K的值:
    + p+ Y6 x# q' ]! x& o# I% m+ U
    3 W/ b6 Z% `* M* o如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    8 o' g( }0 ~- y. t0 t  W/ L" Y; y4 |8 c4 t
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    ; L8 r3 M9 [7 _% c! C2 R
    ; L! L" U5 H2 y  ?  g
    ! x) Y9 n/ g/ o8 p#Import Library, |9 [1 b0 k' }: T1 F2 y+ `# u
    from sklearn.cluster import KMeans) x6 o0 t- {5 H/ m/ z2 Y2 K: t
    ' v" a: Z9 R4 g1 r
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset" j5 J  V. G/ W% a+ X
    # Create KNeighbors classifier object model + k2 P5 C/ |5 W) _8 Z
    k_means = KMeans(n_clusters=3, random_state=0)
    , b8 k  t; {; Y3 _4 M' S  b' G6 V, k# X! _
    # Train the model using the training sets and check score
    6 @7 Q. E. I" w% I0 q1 t7 emodel.fit(X)
    + z9 x; f9 i  z3 m- D$ E( D9 h% @' e/ v) b
    #Predict Output
    . U( F) c) m  j+ b6 B' s6 {! Ypredicted= model.predict(x_test)
    ( t( a; M2 W1 S+ `' c3 B4 V& u8.随机森林
    * d8 P" |! z' r1 O- l, H; o- _随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。) `- N1 O) i" N: S
    2 S% s' G4 {- [& P8 h* e* m. t
    怎样生成决策树:
    ; N) I$ {3 T2 N" x1 ?. V
    , ]8 e- M1 h% E  b! V如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。1 D! o9 R( @6 Q
    . q0 B  X2 @: v
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。+ P3 o4 _' k0 }% i" Q

    % P* J' F" r) h+ ~8 V每个决策树都最大程度上进行分割,没有剪枝。+ d0 m3 \3 I/ H; X
    0 N) {. ]9 T6 X5 _$ D' C  _
    #Import Library
    4 w$ B7 T5 z# q0 `# xfrom sklearn.ensemble import RandomForestClassifier5 s$ u' y6 X! b* A- [
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    1 `5 q9 a( `. l" I7 C# d
    # q) X/ B1 p2 U# Create Random Forest object
    * x, x* l' ?1 F1 Rmodel= RandomForestClassifier()
    5 v9 K* F1 L; w
    6 k6 G* B" ?4 B# Train the model using the training sets and check score
    ; i' m/ z* F, p0 mmodel.fit(X, y)
    . K' m# a2 W1 N0 t
    ' m+ f- G  J0 Y; ~7 p( ]3 ^* N#Predict Output6 C, L0 l% e5 R
    predicted= model.predict(x_test)) P1 {# ~1 w/ @4 ?2 r
    9.降维算法(Dimensionality Reduction Algorithms)
    6 a: Z6 D8 O& v在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    5 p$ Z  x( H0 l: X' k9 E0 k- @
    . C2 I( I7 u) w6 Y* D1 M& K例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。8 _' ]/ ^1 t8 F2 u- m3 Z7 M
    3 w3 D) N0 I  \" B$ L7 V
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    " T+ t6 a1 |' \+ r1 I8 [3 N
    & a5 O# h. P* K  e6 H' V  [8 G  @- _" Q* V7 O
    #Import Library2 |* R; F% g% e2 z5 ]9 }
    from sklearn import decomposition2 k0 e3 C9 Z' L/ p8 `2 E
    #Assumed you have training and test data set as train and test
    5 g. h& k: M- O  g9 \# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)( V1 P; }+ \# E% m& C4 B
    # For Factor analysis
    ' N! O0 x/ L) |" K4 l: R#fa= decomposition.FactorAnalysis()- t, H3 x4 K- n4 ]4 s% l
    # Reduced the dimension of training dataset using PCA2 I2 {# m; f& k% c  A( B6 @

    , T! ]& r6 u* ?; o. strain_reduced = pca.fit_transform(train)
    6 U/ Q$ U4 h# j) u4 _2 j
    $ U6 u+ q. {/ E0 _6 u# y#Reduced the dimension of test dataset
    ' ~$ ?. R+ Q& ]/ I* _test_reduced = pca.transform(test)6 N0 q- m% t( c- G
    10.Gradient Boosing 和 AdaBoost( E* g* F/ w, P7 t: P
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。" W5 O2 n1 E: F) b/ y. Q  j3 S3 w9 r

    - M4 g7 X. j5 d# e+ Y# a#Import Library& F+ t. Y, V# ?+ t; x
    from sklearn.ensemble import GradientBoostingClassifier9 l. a! V$ c. D2 v% z
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : P9 F) l. ]& f7 C# Create Gradient Boosting Classifier object6 y6 n! ^; K5 m$ _
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    ' V; G6 }: e* d. ?: T3 u# _: X1 A8 z1 u- Z. [/ j
    # Train the model using the training sets and check score# J' n/ I& N- g1 E9 [
    model.fit(X, y)3 `( p1 V6 `- Y% ^) b  u
    #Predict Output
    5 w% l4 k0 B5 H( @1 O+ spredicted= model.predict(x_test): t: p9 \  N7 L1 I9 o& ^
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。% Z" ^3 S6 g# V3 i6 h4 b* m& G# H

    1 k3 ]3 I: S0 d8 {/ f- C0 l& ?% @原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386/ R/ ~0 F/ m) ~5 U0 |( S
    ————————————————
    ) c7 }; k+ v5 U% B( W  q; y# j版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " e. |" K0 Z" J+ B5 s; ]/ i3 q原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075" h% x! T( C5 K  }$ {( f: g9 {* C
    3 ~2 k, [( Y- c9 p8 F; B) I3 m

    ( n# e" J  p) ?) N2 D- O, o
    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-6-9 15:42 , Processed in 0.906182 second(s), 51 queries .

    回顶部