QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2244|回复: 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
    ; o- R# V- ^& I* ^" }
    机器学习算法整理(内含代码)
    / f, b; h% ]" z( x' }* z# H; Q. g2 w
    0 G5 d' p9 j* e' a& q6 {一般来说,机器学习有三种算法:# d9 B- C4 i4 |; S! G
    + Z! I- X2 M$ n, k# I
    1.监督式学习3 d6 B; k8 S; Q* f; e$ `8 G) Q

    0 I/ X! e# H3 I 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    8 Y5 S+ x7 h. F& u, z
    3 B) p2 y) `. [0 c1 H3 ^属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    ) F/ m2 h9 m0 [2 Z  \, c* M9 J4 ]
    2.无监督式算法2 F$ O) m- r: v. f9 q
    + z' k. w( b* c
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    5 c% T7 Z& A. z, E5 m& E. o( r/ R- m) S
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    * i& [2 ^0 J1 s% @/ T
    + a6 Y- d% x. X$ P2 F( a3.强化学习. ]9 Z( G! c  x& f5 K

    ' k  ~( m* h% s0 `& L) _这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定9 }  n8 s8 h/ x* A2 T

    8 {3 k' ~1 u/ W7 H" _属于强化学习的算法有:马尔可夫决策过程% u$ s3 Q' m" }& G

    / F4 o6 s5 Y1 M, c8 g; G+ B常见的机器学习算法有:. A4 _& M5 F) g
    : S3 f9 d6 v! ?/ n, F3 ]

    * y8 Q0 F1 m+ |: l! d  r1.线性回归 (Linear Regression)0 L: a2 i5 Q% X4 `

    # ^# c  D/ x/ q& E2.逻辑回归 (Logistic Regression)
    0 ~; `7 S1 v$ N6 A
      f8 n& {; q/ j7 g/ A$ R' u3.决策树 (Decision Tree)
    / E5 l# R6 D  k4 w, \! m, W8 n" W5 E* v  |7 b
    4.支持向量机(SVM)
    , S# s6 ?% b, m% V' r) G
    " ?+ u+ B* r, Q+ v8 P5 x& `, ?5.朴素贝叶斯 (Naive Bayes)2 U: S# q! j' b# V- J  m/ `

    7 |! q2 `1 }9 ?( b* {6.K邻近算法(KNN)
    # p* F4 _( \, R  Z. ~8 G. }% m0 E
    . m/ B, c5 h" \/ f+ @7.K-均值算法(K-means)
    % c2 I' q5 n# y8 Y+ m4 I" G) |0 C
    & Z4 t* e* M8 v3 g8.随机森林 (Random Forest)
    * \1 {' m' k0 g' a! p0 J6 `, j$ {, R* n" }  `5 }
    9.降低维度算法(Dimensionality Reduction Algorithms)& @3 ?0 c8 l2 D3 J

    2 i, N; j/ b4 C10.Gradient Boost和Adaboost算法
    & V" x  M1 J* H1 v* k7 n7 v; D一个一个来说:+ C0 Z( A1 B6 E
    1.线性回归
    8 [- N1 E( L) E8 H. ]9 {" t1 k( x9 G
    ( [' Y7 ^- k8 n* p) V' [7 Q  S% k线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    + |0 S8 O4 o1 ?/ A3 d
    4 Q! r' G" V; V# X1 Z在这个Y=ax+b这个公式里:& o- v( Y( p4 S! w" P5 M  w

    6 Q0 w, |' [4 b4 X1 a4 U2 o5 N Y=因变量8 q5 F  k/ w% \

    0 b9 s) W8 v0 E& { a =斜率
    9 z- T- l) u/ g( P4 u7 f
    1 z, e4 f. x! \5 j2 _( m5 V0 G: ~- P x=自变量7 O" e; T& w3 s
    ( _+ V9 D5 b- T2 o% d2 I5 E& m
    b=截距& C: l1 R. k& J# r
    6 H& v1 B' {& U3 V8 A
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    ' E. T: T/ Y( S$ A& ~
    7 M3 A3 z5 \* o我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    " e. }7 L* l4 M
    0 w% W3 x2 b" {! a- q给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    + f  b; V9 _% F4 o5 [& q+ w/ W+ S: Z7 ~8 S# c0 G

    ' v* K& I7 S+ v0 ^3 [" n/ \) t% }& a, {; S  u3 c2 g# y5 L$ U
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    2 _) ~% S7 F' R; J- z
    # Z# J, Q) g! f" x& H6 q( A1 K* b拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    % W3 G# `' Q3 B( Y
    ; S3 L2 J4 H  }" B8 x1 TImport Library
    - ~0 _8 h# X* vfrom sklearn import linear_model
    1 v$ _$ m8 Y% M6 x- i  d( x! ?/ X0 W, S3 x2 h7 [; T
    x_train=input_variables_values_training_datasets
    9 L. q% w/ e( }. t( _y_train=target_variables_values_training_datasets
    # E( O3 X4 `* F0 G" O( Sx_test=input_variables_values_test_datasets
    - w7 ^  W0 g* C( U$ h. T) }% Q0 U- Y2 W2 V( [7 k, s
    # Create linear regression object
    ; Q8 \9 Y3 n6 O/ E8 Rlinear = linear_model.LinearRegression()- f* {8 l3 J! i. B% J# M1 v
    & S9 i# D+ }# M' _) s
    # Train the model using the training sets and check score
    , Y1 F! b7 ~$ X: p& Hlinear.fit(x_train, y_train)0 c) k  ?8 ~+ o5 C$ c( q
    linear.score(x_train, y_train)7 I2 K5 Q" D$ Z6 ~) G; t
    ) E2 N+ O% ~' U$ b2 M" V( O; v
    #Equation coefficient and Intercept  Z- w9 H! c, L) N7 x* o
    print('Coefficient: \n', linear.coef_)
    * R. z" C6 t, z# v# ~! H7 B9 {print('Intercept: \n', linear.intercept_)* o! L) ]' F: R2 G1 _- _$ {

    , h' d: F: D, ]" f#Predict Output
    ) X- p7 P5 S5 U0 v& h- k" spredicted= linear.predict(x_test)
    / W- F, F: q8 d3 U, l2.逻辑回归
    ( x; Y4 n" ]9 w逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!4 ]: z0 N3 J. p8 ]& g0 f( D
    & j3 u" Q; z, ^( \" R! X
    同样用例子来理解:) y5 p% w. \- u2 f" @/ \9 J

    " O) K& n* J# b* ^0 [8 ?假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。) f0 D5 S) ^- d
      ?2 |: f) L7 a4 s7 F
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧- S7 M/ f3 a6 `" V6 e7 w4 d
    9 x6 K7 v6 M0 k5 r4 [
    最终事件的预测变量的线性组合就是:
    / r! u8 c/ U; @) F: Z) i+ \: L5 O* R0 h6 R( h" j" X4 Y9 W
    ' n' q; U+ `% d0 D$ [
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence- ?; ]2 Q3 S* {+ C; I3 O2 d1 p& p6 }

    # }. O* |5 u; ~3 I; ?) Y; zln(odds) = ln(p/(1-p))
    7 E- W* I7 y4 k8 g: ]4 q
    8 p' a/ i9 ~+ t: P  Ylogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk2 t7 ?: {: X. I* D9 D  o& r+ I4 f
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.+ \) R) ?8 _8 q0 _' }

    5 s" _+ T- m& _7 ]( V9 {! P4 v: M至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.5 T* M% Q4 `, S+ G! _' {6 O
    # l3 w) \6 M, Q% u  s: a3 _  j1 O/ L
    0 C8 T% s" ^0 T  p" M

    6 |% d( v- q# s5 `- f from sklearn.linear_model import LogisticRegression
    : A/ _# p! V! T5 a0 Q3 y% I: ]) M" q/ _  R% l9 x6 O
    model = LogisticRegression()' M  L7 k& ^9 j6 y& Z
    + v  A) U* |( p# Q! o0 I. z/ x
    # Train the model using the training sets and check score1 n$ i* h% Q# P  E4 o
    model.fit(X, y)
    : R5 K5 b  h1 `' U model.score(X, y)6 I8 L0 {5 m' l& `6 Y! C+ ]
    ) X+ o- X5 J3 ~2 ~/ {6 U4 d
    #Equation coefficient and Intercept- t% z7 e0 q8 k: J& H3 E2 R9 i
    print('Coefficient: \n', model.coef_)" }9 P/ @7 M1 ~
    print('Intercept: \n', model.intercept_)
    ; E2 f' _7 X. S+ N4 ^! |: v2 i
    6 z; _4 [9 L/ }: C #Predict Output
    ' C1 h# h- O1 m3 _ predicted= model.predict(x_test)0 \) a# r9 l6 P4 ]  }  c& Z( W; X
    逻辑回归的优化:
    ) \4 E' b9 E, F. m加入交互项
    $ p  w" U+ }- I7 N
    + J% j7 ~/ [! ]# e+ v9 @  减少特征变量3 b9 h- W- r3 B+ K, S; m7 H

    + f, r) ~  r8 U  正则化0 H0 N" O, S8 j4 y
    1 i" S0 x% O+ d% Y
      使用非线性模型- K- I/ f% Q! R, q9 x6 n5 s
    1 |% O0 U& e( u" k) I
    3.决策树! T& K( H" k8 `+ P$ l
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。3 n, k. X5 I2 v6 l3 X1 E$ i9 g
    4 K% B/ f0 T; {0 k" t' q+ @# v
    8 Y/ P( l% e* n' J! g' _& H

    + ^- J: D9 \  y从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。! v6 u6 d' f  u- k( {

    / F6 h, Z/ q4 ?2 w) p% ]. w: B9 B' K8 \6 A7 u5 R1 X
    from sklearn import tree" }- f/ v$ z. @5 e% T; p
    - g1 U' D5 i& p" D
    : ?. s; s& S/ p! @: d, R7 s# D/ j9 g
    # Create tree object
    . I* @& ^/ q  H) xmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  $ ~. }( h# [: `

    . \! A# g9 I; Z1 B3 C6 z- s- A# model = tree.DecisionTreeRegressor() for regression
    6 u1 y! m% y5 H  \; ^# d
    # \/ O4 k3 E5 v; y( E; [8 j# Train the model using the training sets and check score
    # Z& [4 V/ a* s0 y, W' ]0 ?model.fit(X, y)
    ' a" `2 M0 w" p1 o+ fmodel.score(X, y)
    % T8 B1 x. `' \* [; v# w# C, d' p8 C6 S( W
    #Predict Output$ G4 L$ ~/ G2 c7 J
    predicted= model.predict(x_test)
    8 j. n0 Q% W6 M: e* K4. 支持向量机(SVM)
    ! Q0 v" ~- j' U6 Z  Q" X" [. \这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。4 d" X! w- `8 R# v2 f

    9 Z$ A4 |9 v& J! c  F( [$ H现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。7 b# U/ @7 j5 Y

    ; ?$ v& W; y- P+ O3 S' K
    + F! D0 L& q& R0 W
    # w! ?( m5 A# s0 E- F在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。3 {3 t. D, o( u. w5 n
    1 B) G. X, C# }' n' R) f" \' [
    #Import Library
    / K" L8 H: ~3 Jfrom sklearn import svm
    . r6 G/ `9 ^3 p, q#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset5 y$ s8 D  U- P7 \: w* W
    # Create SVM classification object + Y1 v1 C* O6 X) i' y8 O  f

    4 B" }5 p! v4 kmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.6 `5 {1 B& K% l! G, h! ?9 s

    0 _' x4 j2 {& \: ^8 F3 g# Train the model using the training sets and check score' q2 K3 ^, F9 Q$ \# n$ m2 z
    model.fit(X, y)
    * L, C. D# G1 @1 `$ S$ t2 T1 N( _model.score(X, y). v" S9 K. S* f# r
    # e8 t$ P: @) T4 {3 D
    #Predict Output
    0 l% i1 s" p. w% ypredicted= model.predict(x_test)
    2 U9 W! R( z& L& E5. 朴素贝叶斯
    4 N7 z: c( d; L- n这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。+ {9 U5 R2 s9 \3 r( y
    - s8 W6 ^9 R: D$ C3 s
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    1 b3 ?" s% s2 s- Z- @
    3 M7 B8 E) }0 `  M. M0 i& [贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    $ Q$ ^0 |- H1 O6 Q7 x" ]0 L0 W" _9 v/ ~
    * s0 J1 r, r# ~
    P(c|x)是已知特征x而分类为c的后验概率。$ W# _+ ?8 \. s" L

    : l7 [" g, ?( j1 d- i! E& VP(c)是种类c的先验概率。# b. I  M% o; L0 u( P

    4 Y& O* o4 C& v3 pP(x|c)是种类c具有特征x的可能性。
    5 ^) }6 q+ _; O" E, a, G6 ?, @& T" A+ I6 M* l
    P(x)是特征x的先验概率。" L2 F; o* F7 v6 m3 E# u

    # b0 P1 i4 i4 H8 A5 `$ E$ x1 i7 d) _" |
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:4 Z* m) p, F, {7 L* r

    : `. y% F# K2 r0 {( F# c$ d$ L步骤1:根据已知数据做频率表3 P1 S& x" ?# g4 m1 o

    1 P0 Y) t' \; E) W步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.) i0 ?/ U2 u( p) ?/ d

    : J. @- k, @6 \
    " v0 ^5 K! C" D6 ?" X4 J# v步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。9 P, t2 W7 p/ B* r( M( d8 B7 J
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?$ @* r% ?4 H( ^5 m$ k

    - p5 G+ S" [7 c3 b0 A& h$ i我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    # }6 D' i+ v1 o. Y3 p0 s6 `+ ?$ F2 T, a9 r5 r8 l7 J; `
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。4 U: f% K- Y! V
    6 b; Y, m9 {7 R" i4 x3 J; o. M
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    ' i. P8 f9 g. U, {
    1 O- B1 S3 L+ ~" B/ J' s# E' h当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。/ e6 F9 }3 q% Q4 s5 c0 d
    5 w1 |, q9 m4 U
    #Import Library* u  k) c: q) b2 D5 `# e% t, J
    from sklearn.naive_bayes import GaussianNB2 a1 R7 o# s$ A" ~% t4 T, n
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset7 \) `" k3 ], s% `$ L5 f& G! [
    / u/ i$ `+ V+ `( R, G# \
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link  O; ^1 c2 c2 h9 z

    2 L- s# Y. L# z  g# Train the model using the training sets and check score
    0 z0 D) C+ S2 N, P, [model.fit(X, y)! G0 e. j7 k) [% ~: G! x
    # k' g+ l% W2 j5 o
    #Predict Output
    & {" p! p* P1 K& Zpredicted= model.predict(x_test)7 p# n% c1 ?. k& ~3 l1 ~1 F& J* b. Z! {4 P
    6.KNN(K-邻近算法)8 r2 Q3 R# D" i3 W. p
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    ' s$ @' S( C) F- D, ]  A* `; ]* H; W1 {6 b& u
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。: _. }# D6 g' K- B+ P  y
    ' J/ r% a- Q6 Z$ W# x9 Q1 s
    , a( Q5 w2 ?( q6 F! f3 i3 x
    $ Q0 y! ]9 o' i" g+ s. f
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。8 p2 r0 L8 b, T
    , V; i( b! g" V
    在用KNN前你需要考虑到:* h- E+ i$ Q) M, D
    1 Q: v1 m/ Y# D# L* H
    KNN的计算成本很高
    * a, f+ s: l6 f+ l. f/ _. Z( b2 s9 p3 u4 q  p" F3 x
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。( p9 K8 d2 ?# ?1 \
    + u) p& `, R9 e, e/ J" |
    在进行KNN前预处理数据,例如去除异常值,噪音等。( J* e% O  o8 }7 K$ |1 a6 c

    9 d2 `" Z- Q( s  Q# U#Import Library
    ( I+ d9 B! X/ W# B2 M, T1 Yfrom sklearn.neighbors import KNeighborsClassifier
    & q! a5 {6 t/ G7 @: r( O
    / y9 F1 ^: `1 B& T& q#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 Q% d# T8 H4 k9 w0 Q, E
    # Create KNeighbors classifier object model $ q4 Z8 E/ {" o6 Q5 x

    3 Y1 l4 ]- E& V/ m) eKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    7 n7 U% Y+ v! o5 M3 @; J" m4 D! a2 P7 _1 @$ K
    # Train the model using the training sets and check score
    & h3 B  o: i  vmodel.fit(X, y)
    8 y2 c0 P2 E5 W, J- v, H+ h) k
    6 w( [- x# A' y( V$ w8 A1 B0 _#Predict Output
    8 P% F+ W; C: E" w- m; Npredicted= model.predict(x_test)
    ' S7 |* ?/ c2 e7 _, I3 P2 t7. K均值算法(K-Means)
    " d3 ]& |2 l1 a* y4 w5 @这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。7 y2 d: m; K: k" Y; p1 o. O
    1 C9 ^2 p) f4 L; S1 h6 D$ ~2 X4 T
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!! A6 ~/ O' W2 o6 N* l( s
    ' d2 A+ T& t6 v2 c. Z
    : N7 z, h+ r+ ^! M
    K均值算法如何划分集群:
    0 A' P* x( T+ r; y5 _- M# a# N
    : t( A% U% x7 j  u1 X3 i, b" l
    # @1 p( r7 r! D9 g$ |! G1 y% e% V! R# I7 ^
    从每个集群中选取K个数据点作为质心(centroids)。
    " x: _* y9 ]; n2 l$ ]" P
    % }% ?( ^. O. Y6 U将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。& m3 c4 G% j  x( w
    , T6 O* F0 @+ f* X$ `) F) p/ G
    找出新集群的质心,这样就有了新的质心。
    + G9 f) @6 M) ^& }- Y$ g; C; }: ^/ [2 d8 b
    重复2和3,直到结果收敛,即不再有新的质心出现。. @& s. M$ ~0 y1 L- J+ Q$ j+ S

    / X. ~/ {, z' a8 Q9 x3 j; |2 @; x# o9 f+ O
    怎样确定K的值:7 _; v' C* z4 S
    . ^+ ~! B# R5 f- e7 s8 l4 c2 v% n
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    # H' Z; N0 G. W9 S# S: f4 @4 ^; E& [( [- \2 a
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。. I2 ?1 d; Y' ?% x" v9 e1 q- W+ ^; j+ x$ w
    9 v! r! [3 H, C6 K% K1 Y" R

    ; p1 ]$ ~% w/ M. J# D#Import Library5 ~9 F. ^5 ]2 C
    from sklearn.cluster import KMeans
    3 J. K/ U& `# m" }! E8 {; O- f# G  A
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset& ?3 O' k. k- y- N$ A
    # Create KNeighbors classifier object model / i9 C3 V0 L# r( q, Y- ?; w/ _
    k_means = KMeans(n_clusters=3, random_state=0)
    & y( G9 y0 @& E$ W, y2 n+ `* _: U8 L: _; U
    # Train the model using the training sets and check score
    # g  _6 e. F0 ?2 E' }7 V  Fmodel.fit(X)
    ; F5 z5 E# \/ i2 G0 E9 h8 ~! C* \* w
    $ I4 X" t3 P2 ], q#Predict Output
    $ G7 e& A: y/ u& x6 ~predicted= model.predict(x_test). y3 Z* X+ {- L" h. c
    8.随机森林4 ~) U1 I9 V' g& W3 l9 z
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    ( C) b% ^/ R- D, @5 s# |
    $ g# |1 s# d: a. O怎样生成决策树:' c# M9 ]3 n6 {6 b, B
    - H; a& j8 X! N7 k/ i7 n# [( q
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。3 @# n- I. G; E5 |* j5 [2 Z
    ) ^1 I, i7 i# K0 `. A( ^. B; B; ]
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    7 q1 i: K  N+ z3 a) V$ U5 J  O# B/ C# l3 Q: x8 Q% B. L
    每个决策树都最大程度上进行分割,没有剪枝。5 y  |/ n# \0 H1 u
    ! u3 ~* [; S0 n& Q4 }) \
    #Import Library+ L/ h' j9 C5 V# h0 z
    from sklearn.ensemble import RandomForestClassifier
    ! B: [9 q" p" j1 q; \#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset. ^5 R+ j8 y4 S8 A" H- a

    3 f  _" S( j+ `# Create Random Forest object! _/ l4 r6 N$ \0 b" N  h. F
    model= RandomForestClassifier()
    0 m0 t: c; \6 ^- r- x+ A' H) v# b1 B+ p* y+ N: _+ d
    # Train the model using the training sets and check score
    # P& N3 ?) u" f; p; }$ l  t- m7 Amodel.fit(X, y)
    . O# w+ q* Y' `6 r) C" I
    ( W- b& @1 |8 P#Predict Output8 i# A, |! H$ d" m+ Y) o6 y
    predicted= model.predict(x_test)
    # B  R+ Q0 t- t9 i& A% |: t9.降维算法(Dimensionality Reduction Algorithms)
    # p5 ?! l% y7 A) J2 B2 V3 w在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。4 \" a/ U# n( [+ f! O' v

    . f2 {0 R/ L) _1 Q5 i0 A例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。7 i8 i- J* m  q5 _
    6 G4 E5 l& z+ m! P1 `2 H8 V
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。" i. ~8 s! F, C, I' Y1 m

    # R. B: g4 H3 |/ @8 D& t: o( N1 s: |0 e- a2 F
    #Import Library
    ! }) g! {+ O; T4 m7 yfrom sklearn import decomposition
    3 A. T5 w3 x6 }8 D, ]( x# L#Assumed you have training and test data set as train and test+ o7 P: I& K" i  W
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)" m( Y" ?9 U4 B
    # For Factor analysis* f! N0 x' j1 X1 X- \& o. y; _
    #fa= decomposition.FactorAnalysis()
    1 Z- l2 T- c( Q" r; N# Reduced the dimension of training dataset using PCA( M3 E/ A7 ?, u6 m3 {
    $ T0 M$ ]( z2 O( V; ]+ }
    train_reduced = pca.fit_transform(train)/ ^9 N$ G% Y. t0 }% u" L
    1 O( [) X1 K4 v; A5 S* N$ N
    #Reduced the dimension of test dataset' J$ `5 t5 ]9 G1 O# ~/ E, s7 j
    test_reduced = pca.transform(test)
    3 R6 ]( X" f0 F& c10.Gradient Boosing 和 AdaBoost
    2 O: c/ z2 {1 T3 f, g+ |GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    : W' _! Z$ M7 [: }# i" \5 H) m/ q7 Z6 i7 ]# _
    #Import Library
    $ x$ F6 P7 [4 u. y: mfrom sklearn.ensemble import GradientBoostingClassifier' j! u' ~7 V, u
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset; U7 c5 [% c% Q1 N
    # Create Gradient Boosting Classifier object
    % C9 ?3 }" u! s# t4 Hmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    5 Y( |- s1 l4 [2 R% G9 P, y! V# M" ?6 {. q% t2 X5 h# P
    # Train the model using the training sets and check score) i$ r* b/ i- a" h% a' i
    model.fit(X, y)! \/ E6 y& G& e4 u0 n
    #Predict Output$ h9 V7 T* t- ]: l* V/ D
    predicted= model.predict(x_test)
    8 ^- ^/ z" M6 T4 W6 v9 |7 h/ qGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    0 K7 ?4 k) f9 n# y" ?* x4 ~3 F+ R  F. Q
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386$ f/ _5 ^- x. Q% X2 p' m2 C; a- |
    ————————————————
    ; F* h) x3 @* ]3 `& L版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# h3 d. q1 S6 t6 N$ @: X5 f
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    5 d2 M/ _  n5 F4 V+ ]% Z* P. I+ m" Q- {  w/ j) Z+ j
      l4 j9 i8 q" d# i
    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-9-8 19:51 , Processed in 0.303703 second(s), 51 queries .

    回顶部