QQ登录

只需要一步,快速开始

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

    0 A0 g4 w7 P8 v机器学习算法整理(内含代码)$ @. r( ?8 {+ n

    7 X, A, y6 m! E+ \) a; v' l* T) c一般来说,机器学习有三种算法:
    - v* v3 ~2 k! f* K) |6 V
    + P2 \3 U* X+ f9 ?# F1.监督式学习
    + d+ G5 B) d+ I4 o5 P8 s# i& i3 B6 t2 e+ \
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    ' ~( c% Y$ `$ @4 E9 S4 b* A
    " A7 T, A2 x; P4 {8 j+ j+ T6 g. R% A# M属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法; V$ j$ g0 w; a5 s  l
    1 V% M- u' j) k3 Y
    2.无监督式算法$ S4 I( O; h9 k6 |4 r& p

    7 ^$ @; \( N8 z8 c无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.$ {! A5 |. r- g9 [( C! s6 q
    7 M+ n& _) s6 z2 m0 e
    属于无监督式学习的算法有:关联规则,K-means聚类算法等0 A& G, k* [2 i9 e' [) h

    4 H2 Y- C( ]5 k2 ]3.强化学习
      r; o) G+ @7 I/ h" X' @
    . J4 I6 A' b  [. J  F' Y4 J. v3 f这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定& d# P5 a; s% N  a+ k4 J  l

    * {5 O# l3 Y& D2 v属于强化学习的算法有:马尔可夫决策过程
    5 h2 Y  K& x) \  }
    3 C- ]+ h  k/ ~+ C, k常见的机器学习算法有:
      x: N  W0 u6 r$ P, E- @& E* H. O6 m9 {9 a0 Q8 Y' E6 Y! ?& i

    , ^' z6 Y/ M8 D1.线性回归 (Linear Regression)
    ) D8 Q( C) @) a) u6 C# B4 P5 w! x$ i; {  T. ^
    2.逻辑回归 (Logistic Regression): ^7 d4 L9 d: O% l
    7 z3 x- _& n  R/ S# U, y( D/ h/ [
    3.决策树 (Decision Tree)
    0 c8 u8 w0 p- ^$ H) [* `" ~. E3 A! _4 G3 h9 Z% p2 g
    4.支持向量机(SVM)
    2 w1 p" s, F* f- W
    9 Z" F, _4 O& z( M' z- @9 s8 a, d5.朴素贝叶斯 (Naive Bayes)
    4 X0 p$ q+ p: Q- ~* {- j4 n- {7 X+ |' G5 p$ e- K
    6.K邻近算法(KNN)
    2 c1 f) ^6 ?8 w' ]9 n" v8 c& f: Y  R. L( g) S
    7.K-均值算法(K-means)7 V  e- F& ^8 R5 h$ v
    9 ^" j! e$ K* ^4 b4 j: i
    8.随机森林 (Random Forest)
      V" w$ o- P/ I/ K% x
    7 M  t6 q6 Y6 V3 b. \0 a9.降低维度算法(Dimensionality Reduction Algorithms)
    . G( l7 Z) S$ \5 ^! j4 R& j8 i5 x& W6 t! A2 x+ u9 D
    10.Gradient Boost和Adaboost算法* a; `- x/ u9 N) a' R; m/ G1 J- y
    一个一个来说:9 {( W. {- c+ t5 k. x' Z
    1.线性回归
    . S* Q9 B0 V  ^: {% ], O
    & a/ Y0 s* [3 {6 [9 D' w) F2 G线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.- ]0 `4 c8 x( n
      U9 c$ o. v* Q% X
    在这个Y=ax+b这个公式里:
    2 t7 t& L" ]- H# n1 N* D) s; j1 ^. W" D" `0 ]- u
    Y=因变量$ h( k: F& b2 l" F6 O
    / `6 Z8 T( @/ s6 \: B. [
    a =斜率
    $ M1 O3 o/ C' M2 C& f5 ]
    1 L2 T' x+ j, e& K* `9 F1 M; f% i1 P x=自变量
    6 C- z( k+ T: |; U
    6 E5 Q4 j% J% q+ v* y0 K9 E+ k0 I b=截距
    4 u7 v; @1 P3 M9 k* j1 N
    ( O- m+ a7 J* o5 i; N a和b可以通过最下化因变量误差的平方和得到(最小二乘法), U" m' X5 l: `4 L/ v! ]: b3 v! f

    . d" H. Y" v. ~: ?: G1 }我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。; I8 v+ N: a3 r1 |0 E) @

      S* y; @5 V* z# I' U6 T给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    / K* T; h. b. U7 k
    : F  n( u4 W& Y) }7 C1 X* q( z
    ' ]% {& h3 Z! x* G: _$ W  o6 J3 `1 w  I* P7 {8 ?5 j' K- w
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.+ c% a0 |) X" ^* ?& _5 h0 R5 b1 o

    & k9 p% j' L8 u: ^拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    ( B, E( H% ?3 I, R. e1 i" X$ A, v& ^* E
    Import Library
    7 d& j! l5 Y8 a/ y& Y. \% g, j5 _% Pfrom sklearn import linear_model( [# w  C; M" q5 Z$ W3 f- ?+ B6 B
    ; S7 j( a. F3 E9 i6 J
    x_train=input_variables_values_training_datasets, x- `: Q) o2 F2 H( a, Q
    y_train=target_variables_values_training_datasets
    # l8 ^- e1 d9 j: }' Jx_test=input_variables_values_test_datasets& G3 Q! u1 ]" i# Q- {- U6 j6 \4 ?
    ; A2 K1 X2 e) c( I4 R) I9 r# u4 u
    # Create linear regression object2 C1 @, G) _! U2 }
    linear = linear_model.LinearRegression()0 @5 f& R/ a7 w

    7 r0 C4 l7 }. x. D" p* ?# Train the model using the training sets and check score
    ; L5 r% J$ Y& o; }% _linear.fit(x_train, y_train)" I- z3 y! \( \
    linear.score(x_train, y_train); O: o# }3 c7 I$ j' }+ y  b! o

    6 E3 d. @6 y0 J  Q6 T( C#Equation coefficient and Intercept' @4 }( y9 `& ~! J. t6 c' [' |: ]# j
    print('Coefficient: \n', linear.coef_)
    , D* I: M. W+ |8 s- bprint('Intercept: \n', linear.intercept_)
    3 E5 L3 j) H' `3 g# U/ u
    0 D3 ^7 k5 K, g% }#Predict Output0 i: ^6 p- i& `1 i9 b* d* N
    predicted= linear.predict(x_test)
    # y4 k% h" h) s, |* d3 G2.逻辑回归- P, v6 M, h- a: B
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    % N% h9 T$ C3 Q7 h  u
    : V# h; h! n6 D- w. S同样用例子来理解:" |5 K# r; Z5 Z" F

    ! e7 ]8 \. D# T) N% }. c- N& G假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。: B% o: E) |6 U

    7 k  X; f9 `1 p! E* c4 h0 k数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    ! i: E/ b9 _, y5 |" J* w
      h; B$ p7 C5 b  o  Z最终事件的预测变量的线性组合就是:* ]; W' P/ |( O+ M) I3 y$ E2 Q
    , E7 @& D$ q0 ^1 K) I+ g: g

    6 Z% k$ E( R' lodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    $ Q. ~1 G' s& O$ x* i2 z
    6 O# ^0 f7 Q3 `9 {ln(odds) = ln(p/(1-p))
    3 x1 T6 `. i9 L, {, N
    : O+ J. i0 U" ?0 v+ Z5 [. D7 w- Plogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk$ k- A- {+ `5 q2 b6 g5 C! v" p
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和., C0 p" {- y; Z/ K; |1 y

    # @0 H+ Z( @2 K/ Z- f: X至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    ' P! k2 s) o; ~. ^9 H$ f! P3 m: O/ H, V  p9 p8 s

    3 E" x, k* T* v. G6 U1 g1 |; v1 \7 Y1 M  j/ ~; I) f8 n3 m$ O) ]# r
    from sklearn.linear_model import LogisticRegression
    8 i6 c& X2 V+ I  I/ _
    ; h- {7 \- L- g: R model = LogisticRegression()0 n# T+ m8 i$ F0 U$ ]

    " Z* o8 h  f; m) k9 z) u! V# X # Train the model using the training sets and check score: X. ^1 Q2 V, r
    model.fit(X, y)4 z8 v& c* i( S) k& p, a/ ?# y9 Y" @" p1 \1 R
    model.score(X, y)' y" }, Q0 p( R
    # j, o  _4 p- b: [5 Z$ x/ r
    #Equation coefficient and Intercept: ?% J5 y. ]8 w
    print('Coefficient: \n', model.coef_)
    3 D) H" T8 q( `6 F print('Intercept: \n', model.intercept_)
    . y/ |0 X, x* i. t# {. a1 M1 a4 M+ @. r, C
    #Predict Output% y& F% o9 |# f6 ~% z# q4 F2 R5 _% R
    predicted= model.predict(x_test)  l2 l4 P2 u: U8 r
    逻辑回归的优化:$ Z1 s$ i- `9 r8 g% N$ Q
    加入交互项
    8 u" t. ^- y( s- Y' r3 d8 T- w1 ^" O4 }5 x
      减少特征变量
    . x5 a) S4 o/ c9 ]  \' Y: \' ]; w' X/ R- ]
      正则化- ^4 g; }; V! V* b. q' S
    1 `1 Q' {+ A# G
      使用非线性模型, b# C4 D0 l; ]+ J' \8 C! Q  [# z
    ! P3 e( Q- k" c: [- G, O9 O
    3.决策树# i9 d- V) L+ M. U2 m7 a# O3 N
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    . R- Y7 J4 c* x9 [/ n4 G( P5 {
    . S3 _( K  I7 Z; `8 y; g. ?! @# ~& l, W- z- [# W7 Y1 m; ~: T
    : ~1 E$ W7 g" z3 U
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。6 `* N) c  j2 w/ Q; I

    % K3 h6 s; A: W& s: G- D; l! ^7 \$ G3 l0 h
    from sklearn import tree
    7 I: |, p' g. g
    ' Y( G4 n- V# p0 p! g
    9 v4 m- |6 r$ D1 }' V$ P& i! i# Create tree object ! d/ V% @% G9 i: `, d1 l3 |
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini    q) m  V4 `" F; v- I
    0 Q" o* \; G8 \; x
    # model = tree.DecisionTreeRegressor() for regression! J  T" }5 j4 Z+ U
    ) v! D8 m8 b8 v0 ~
    # Train the model using the training sets and check score1 a' G4 d) p5 ~& j
    model.fit(X, y)
    0 B9 i) u9 L+ X% Cmodel.score(X, y)
    ! r& O8 \' }' i- D  m/ I) O/ g& O
    ' R+ q) U! M' ~0 ~" S# i+ Q; V( h8 {#Predict Output
    , [% n8 i+ o( `/ @5 M& {predicted= model.predict(x_test)
    1 |! y( }$ i* ?4. 支持向量机(SVM)0 K/ ^2 \# J4 J- n- X4 ^7 t
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。( q1 o7 H: `4 w4 W  t7 ]) Y0 _, ?6 p
    0 @0 D; K( s4 R) A  Y. P4 o% i6 E
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。) ^6 O( f$ t8 N4 G: W& ^
    % x* Z, N' W5 D
    7 R* g( p% L/ x+ F( ^2 M8 V( }) V* _

    / h) _' P5 i9 U* j在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    ( L, V, d0 k! N8 M9 H$ v1 p5 d
    # X( b1 C" v" L. A6 l#Import Library( n( Y' b" w* b$ _- P
    from sklearn import svm
    . D) _% `& s( L, t: S5 z#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset* q" d* S0 o- T, e* R2 o
    # Create SVM classification object   |  o) S% ]8 N+ `; Q4 ?

    3 ~" Z+ X. }( g0 z2 z* Smodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    ( W! H. {1 ]0 [8 s, D& a1 ^: q/ U8 H" x% ?
    # Train the model using the training sets and check score% _% d% S7 T* J: e
    model.fit(X, y)
    $ @0 ?: s! b& j: i  a! Zmodel.score(X, y)
    7 [# @& C8 S7 ^
    : o( _0 c/ f" U- N1 F5 T) F+ M. m( N#Predict Output
    7 t, G. o! n7 [$ ?. n+ ypredicted= model.predict(x_test)4 M* c* k+ b$ n, ^. P
    5. 朴素贝叶斯" p! A0 O! x4 G0 j) k8 T5 c4 l
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    ; m6 E# ?4 [# X7 |8 O, ?
    % G8 M  K  ^, J6 s- N朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    ' k  ~1 [6 K* A; {3 e9 O: o) l
    # c8 |, k) X2 A3 r3 ~贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:$ p: |: b5 p( R
    9 O* `& Z$ E9 \

    , a4 U% |8 @" n# TP(c|x)是已知特征x而分类为c的后验概率。
    ' c# P6 [5 F; m! M/ o; Y8 ^1 x
    $ \% M! _4 g' \* j- l1 k7 RP(c)是种类c的先验概率。
    . q1 z  w) J9 _9 \( O9 \* C3 a8 e- k5 T
    P(x|c)是种类c具有特征x的可能性。- f" J" ]" y& `2 q! K

    8 }3 G& }7 j0 P3 fP(x)是特征x的先验概率。
    7 P, j+ B1 l/ w
    5 R% W% C" V( Y4 M( ~2 O* R
    6 R3 h  i* U! A0 ^! c9 t例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    ( l  x* k+ }. p0 w( G) ]( J: x
    0 R& `0 W) y  t8 j/ o0 b  y步骤1:根据已知数据做频率表
    4 ]: Y. r' q. n+ _" t! q7 |# K/ z) X, r& T9 j. O
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.& d% o1 |- E) P  p
    3 g" @  g7 [* ^! e2 h! C
    % g+ N* t, V/ V$ ]
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。+ R3 |  |& ]+ \- N4 `4 |& s7 e  j# p. r
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    ; D+ ^  \% R$ K& n
    ; U4 u5 k3 D8 {  u) g  l我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。/ v* a6 B. H1 M4 o% Z
    ; R1 i* \4 M+ t# W' s
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    # J# e% t' _& `# v
    0 y6 B# ~4 B, W- Q那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    ) A( R$ \8 L* j0 p
    ( m4 n/ T& P. c% F$ Y; G: k当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。) c9 F  M& u) e9 H8 W

    8 f; t* I3 I1 f3 M+ v+ @$ Q1 j9 q#Import Library
    % `) h+ S  K: ^) d1 k. }from sklearn.naive_bayes import GaussianNB! u$ ]) j& o" z8 o
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset% s4 U. V3 I8 Z9 Y0 t4 J" n2 R

    4 G2 ]6 X  w& r4 j# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link1 P2 G  n7 P0 b. d: X% ]
    . R! B3 p2 W% z& H; n
    # Train the model using the training sets and check score
    " I+ }: S' o! t! M0 Rmodel.fit(X, y). l1 P% m; p( k8 m' ~* a

    2 x7 P' |; G7 L% V. P#Predict Output
    9 D) E- k! D7 cpredicted= model.predict(x_test)
    8 ?, W- p/ l: v  }& }5 a6.KNN(K-邻近算法)- A0 y' t: x+ G. w
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    - a* W+ K& M' V: Z. O8 A; X; [  G- z1 C( ]4 j: t  }
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。- i7 i, L* \; c8 b

    4 w1 v' d% u6 i2 [: J- {. D9 y0 [" o
    ) I! L: h- e; j  `. C+ i! y' g; J' q% J! \; t9 d$ l4 Z
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    8 [( K- x) A- o9 Z/ _1 }; Q5 F5 f. M" q0 E0 U, p
    在用KNN前你需要考虑到:' a  ~3 C& W5 t7 z0 {

    - L1 B. m: ^2 J; W2 AKNN的计算成本很高
      q0 t0 ?4 j* x2 |% e
    - E& j9 ]+ }  P' V: f: M所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。" J' K/ j! X9 h: v

    % C  P4 {; }$ e" G+ G# G在进行KNN前预处理数据,例如去除异常值,噪音等。
    : m. G* N+ N7 _6 X
    + D# J. ]' L! d. w1 l- v#Import Library8 R- X$ h& {% |# T& [% j  p
    from sklearn.neighbors import KNeighborsClassifier
    ) n. Q% F4 \! J5 M0 a$ E6 M
    " t) i. s0 _: W6 q' j#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# |( x% P# w) ?/ A2 [/ o
    # Create KNeighbors classifier object model 9 z: _8 e  e/ d% d2 p

    . }+ |( I8 ^4 p7 q" i4 {KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 59 [& W4 }: z. u6 t' H

    - F$ \( n( [9 x- Q# Train the model using the training sets and check score% |3 A8 W  b: r/ V
    model.fit(X, y)1 @3 v' N8 j3 {$ a

    % z8 r5 g/ F2 y#Predict Output' C) m  @) O& I
    predicted= model.predict(x_test)1 L0 E. H0 `$ k; |; n. j
    7. K均值算法(K-Means), _, Z: M2 W' s4 M' q( E7 h
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    6 \. n4 Q9 o/ U2 ~5 O
    , [! T! `2 A# [* @9 d, D+ g* E还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!# l1 S/ s  O0 ~" f" b3 ?1 i
    - ?+ {% R4 U5 t

    % j3 P! t; q# }* C2 z1 U$ h1 \- mK均值算法如何划分集群:  x9 u6 ]- F& u8 U' R
    " [, q6 O) z2 q7 u

    + E8 z* V5 a1 I# K3 T) k0 p: Z" |% i. i, G9 v) c3 n7 n* g5 ?  V
    从每个集群中选取K个数据点作为质心(centroids)。
    & u2 c% ^; D  S) G) g/ w0 k7 _" b, T. q/ i( e* _% I
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    9 g& W/ P. j  Z3 P* ^. W" n2 s7 v, y( h: Y) F! Z5 E
    找出新集群的质心,这样就有了新的质心。2 v4 ?$ T; p1 i# R/ p/ t4 @0 |
    8 L( j& E6 `/ J! V
    重复2和3,直到结果收敛,即不再有新的质心出现。
    3 a, ^, H/ r! c; g2 |) D1 \2 Z  j! _( n4 u4 f; B
    " X1 J: Y8 |# _* y- V2 y' ~; u- E
    怎样确定K的值:
    * l' z8 K' T- J; y8 j- e% n( @; T7 R4 g& s1 d+ y
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。" ~  r6 j& X3 _% j9 _. N; w( n; k
    8 O% g: l$ ~0 p- t. t+ q' l
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    4 D" B- E( C# K- I; f+ a& k1 u# Y, D  u' c5 o8 t3 m
    5 i. F/ H' T. S7 _$ n, ]' a. A# M
    #Import Library
    ( y4 ?7 Q, @% t& E) K, v, Ffrom sklearn.cluster import KMeans6 Q7 |# S; w8 k1 Y$ d
    " O; N/ W2 Z1 @; ?
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    7 `3 E6 M( ]% o+ ~4 b& B# Create KNeighbors classifier object model $ h) B9 ?. ^7 s% ~  j/ G
    k_means = KMeans(n_clusters=3, random_state=0)
    8 U3 Q& _7 j7 W, a; a( \# c+ a, J. P* C9 T. |
    # Train the model using the training sets and check score
    2 Y$ t, ]" D7 i& g0 \0 rmodel.fit(X)
    ; W* w4 f1 Q, c5 X1 X
    / _; g' b3 I, p" W* p8 b5 E4 I#Predict Output  a$ Y( n5 N1 [& d9 n% S1 z$ G
    predicted= model.predict(x_test)" u& [# }8 `: y% M' _1 p
    8.随机森林% L: ~# v% K' {# i6 K  o( a& U
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    ) t( e& O; G% K) `# N6 S9 Q
    $ j$ _4 C5 ^2 e) v: f' X% q8 A怎样生成决策树:
    , q/ _' g+ u0 b) ]& U
    ! a' u7 l, ?) I9 g' i3 G$ s如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    # U9 j; I* m$ j: s" [8 c4 c4 s6 P1 N4 R& E
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。3 C" ^5 d- Y9 N) |, r1 P( z
    ' j# R# e. U3 M% }; @! k
    每个决策树都最大程度上进行分割,没有剪枝。9 f) y- E1 A% x4 E& A3 _& j

    8 U' X$ J1 J* q% c#Import Library
    - k2 s0 B8 R" k+ n" lfrom sklearn.ensemble import RandomForestClassifier/ a4 Q( M% O+ @8 g7 ~4 i: ^
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    0 f: |$ U, \' Z* Y9 q
    8 E) V9 G/ G% Q5 S1 l9 [# Create Random Forest object
    : z; H; a. }  a+ w9 W$ bmodel= RandomForestClassifier()
    - ], e5 S2 L) j, ^' ^) H, t  L7 B0 R9 ^  n1 P
    # Train the model using the training sets and check score5 i$ u- S% V3 U2 R6 q5 E# w
    model.fit(X, y)- G  q+ _# O7 C7 ~8 U7 y$ D

    7 `  n, i3 ^, L2 F: |( \#Predict Output
    3 c8 l- y- L% ]" K- G: F! g4 l/ vpredicted= model.predict(x_test)1 J' x. V$ T7 y0 w
    9.降维算法(Dimensionality Reduction Algorithms)
    4 |+ y3 Z  Z. L; s# y' y. m2 z5 y4 j在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
      ?7 \: ^( C. F+ |* ~$ |2 a! ~4 Z1 ]
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。* b" Z# U- c5 s) A0 x" k
    & U* E" _. ?- i5 ]& m0 @
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。* m( ?2 k  [! ~) i
    1 K. T; b7 r& `4 m

    6 h7 F" o# A& ^/ K#Import Library
    8 N; j7 N$ T4 o- G9 u- nfrom sklearn import decomposition
    / ^& S7 F. z( M8 @#Assumed you have training and test data set as train and test2 t1 A+ m2 f) A- v$ v6 K
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    , {  B% B# ^( l1 F: T) b* D# For Factor analysis  p- J9 \6 V" g4 T  X
    #fa= decomposition.FactorAnalysis()3 l3 v' C% f  o7 b" |
    # Reduced the dimension of training dataset using PCA
    7 c: r3 j* K8 h7 O, J, a- q; n# I2 ?( O
    train_reduced = pca.fit_transform(train)% |  H  f+ s) p

    0 c' N$ g9 B9 E; L% w#Reduced the dimension of test dataset
    . |- ^1 U: r# v: ctest_reduced = pca.transform(test)
    , d- U" i' e4 l6 M4 S/ j* A8 G$ y: E10.Gradient Boosing 和 AdaBoost3 T# n% w- g/ G8 |9 A( W9 A
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。/ @; R. |1 `9 T5 W

    ' `) g" R! P; R5 w5 D7 z#Import Library
    ! e" B8 }: ~+ U/ S' T7 k' cfrom sklearn.ensemble import GradientBoostingClassifier
    1 ~. d9 i7 Q+ R6 I8 n2 P( Z#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# y7 t; O* `8 v# a
    # Create Gradient Boosting Classifier object
    " @. F( @# s2 y4 d) P( z! lmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    % s, x( ~2 p- d4 q0 m8 c# U
    4 y! O% X0 z$ i( }0 g# Train the model using the training sets and check score  ~+ {# D1 q9 d+ _; i1 G! V
    model.fit(X, y)8 A! w3 B3 c, g  q+ b. S3 p
    #Predict Output0 t% @. d2 p9 c. m$ _  c
    predicted= model.predict(x_test)- T* k! {+ W7 l
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。. h6 |8 Y8 L; I" x: k% m/ u* M

    ( c6 B( S; w+ b6 G1 \原文链接:http://blog.csdn.net/han_xiaoyang/article/details/511913863 t- @8 s3 s" t( v1 @
    ————————————————+ x7 n- ?( c& T4 w$ t; E0 b
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( p0 i3 s6 [* m- i- M( x8 r
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    + Z' c9 O2 Z3 r. e" y' f
    " b; A6 v% \. j' l" @8 ]  |; C/ }$ X9 w
    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 20:09 , Processed in 0.831061 second(s), 51 queries .

    回顶部