QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2212|回复: 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
    & f* {' X' n& W  _
    机器学习算法整理(内含代码)
    6 S! ]+ a5 L- e" u
    2 i1 e% K! A0 [& W一般来说,机器学习有三种算法:" t& L# u1 N0 m5 l

    7 `- h/ [# y$ H1.监督式学习
      [$ |3 N9 I4 N7 ]6 k" _1 a- M& _
    3 U# a4 M: Y2 q" j! S; w! V 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    6 k* ^  k& l- \# }( n
    6 A/ R- p9 k# |9 J: P属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    6 w8 u% y7 k) e. J* i; a
    0 X& D  n) Z6 `$ G9 z8 N3 l2.无监督式算法
      J+ u) x( \- m8 u6 M
    % Z* T( E" k0 L9 S# L; \无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.! J9 F  \2 W( _, `

    & @3 y* D' ^0 t7 P! H0 n' V) j属于无监督式学习的算法有:关联规则,K-means聚类算法等
    - Z% Y/ m% B3 P6 \& {$ X$ v5 v' v
    3 o) ~6 o* |8 T1 N3 ~3.强化学习
    : L6 b+ v+ v7 D0 _0 X, i$ Y4 Z4 n; Q2 b7 Z- U
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定$ A0 E: }) E" G& F- M8 `( X

    / W. I% P) d1 y4 c8 |- P属于强化学习的算法有:马尔可夫决策过程- u, P+ J. a+ n

    + }% u: e8 H) n* T6 F常见的机器学习算法有:
    1 M; Y# A" Z5 n( ~" Y3 e/ C" {2 m- C* [/ x% F
    # n. g. [5 ^/ F. h4 k+ l: i- }% ?
    1.线性回归 (Linear Regression)
    0 o5 `+ g2 u8 L6 `" s9 F5 i' W6 g9 ^' I* i7 J1 `3 F4 k, ?2 `
    2.逻辑回归 (Logistic Regression)
    / Z/ t0 Z0 d% J* L5 I1 m$ d/ v  k. e7 h* `. Z' }5 j
    3.决策树 (Decision Tree)* D: B$ l/ U" s; v6 n! R, d
    ' o5 m/ \, [0 R* f
    4.支持向量机(SVM)
    5 {/ h1 d$ I, O9 \' ?! p
    # T: q* i6 d3 x! B' ]( g# x5.朴素贝叶斯 (Naive Bayes)0 V4 g7 u+ d2 \: R

    : U. _" @  G  ]- t  ~  x" y6.K邻近算法(KNN)2 R/ u3 t" G. ^) {
    6 J. h% `! w' j, j7 P1 @
    7.K-均值算法(K-means)
    : N2 h* r$ m6 K
    4 N( l$ q; C  R! b# C; W8.随机森林 (Random Forest)' u8 T9 E" ~) V  b6 l+ @+ Q9 I6 r) m5 l
    4 ?$ ~, Z# F$ \4 z% W) Y
    9.降低维度算法(Dimensionality Reduction Algorithms)) d6 g: V2 A9 a' W

    6 ~" l. S+ b& k# k/ o10.Gradient Boost和Adaboost算法. x- q) N( B, m: @
    一个一个来说:8 v% N* f4 H" u1 b
    1.线性回归- N* J* |3 K0 D* `" Q* M
    5 @# X. f$ N3 ^, [9 O0 w
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    . N5 S9 ]4 B/ h2 `# }8 _, s7 O2 `, ?1 N- M3 c% d! ~  j' c
    在这个Y=ax+b这个公式里:
    6 x, h) x) Q  L0 }
    7 j) w. b# c# N" h# g Y=因变量5 Q$ n, I4 p+ Y+ |: H7 A
    1 I. g2 t2 Y6 a0 ^
    a =斜率
    " X; ~( I6 g) S
    ' |8 \4 R" A: r5 l( o7 q x=自变量
      F8 c& u# ~$ G9 e# _- [/ q+ p& O0 F0 u6 E( O( o
    b=截距  [* l8 ~4 a  A0 P
    : G3 a) U6 P1 ?
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    3 H0 [- R: Z  `! o5 J" {4 h& j; d/ b8 [8 }# n% [' k3 W0 [6 m0 I
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。$ ~9 J9 Z, Z% K
    : J2 C5 v! Z% A; g: g4 t0 A
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.5 w% S- H0 n- z+ b2 c( O" J5 X
    1 d- I3 r7 E4 e# O, N( V- Q
    2 S& k, q2 T6 i( V3 b' I8 c

    + z, b: G8 h  f) }线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    # H1 K4 W- d1 j, a/ j( y* l3 E, l8 {6 O, [- U# K; |) s4 g
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    8 J( \. E! \, `3 q2 h& c' D+ ?. v8 b
    Import Library
    ; Z$ i( S( {" }9 S# Ufrom sklearn import linear_model
    5 V9 V2 {) O! p, R4 w
    0 I3 B8 R$ c2 B) j, W+ B' S# ?  i. Ox_train=input_variables_values_training_datasets
    7 c0 ?6 h) W4 I" T1 _/ a9 ]y_train=target_variables_values_training_datasets3 B+ c/ }% K1 h3 k+ o; d6 q
    x_test=input_variables_values_test_datasets% d5 t1 }3 \7 h/ j* e  r; ^( s" Z

    1 R5 R1 l9 p5 B' m3 M# L1 I# Create linear regression object
    # r- Q+ Z4 w" ilinear = linear_model.LinearRegression()
    ) P$ k% K; O, N+ W+ G
    # B6 }$ y, d$ }# Train the model using the training sets and check score
    , ^/ ^4 f) Y! C+ Plinear.fit(x_train, y_train)5 x% j$ k$ W7 C! T
    linear.score(x_train, y_train)
    5 e5 Y# V/ n/ ^4 U6 p, X7 f
    # ^9 z" h5 N7 m( u#Equation coefficient and Intercept
    ; K) l& Y& c- k; g( Aprint('Coefficient: \n', linear.coef_)' `* o. l! ]  B7 H; Q
    print('Intercept: \n', linear.intercept_)
    3 U& _+ M) _5 j' ^4 x4 a* y( Z7 z8 U  Z
    #Predict Output7 V9 m# B5 [3 Q
    predicted= linear.predict(x_test)
      Y4 r; t- U5 w* ^- J. F' @! \" w2.逻辑回归
    1 M5 E  H8 q" E: O# B8 o逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!' Z; A4 g7 i& V; Y
    ; |% y5 r& `, y7 U# f
    同样用例子来理解:8 k+ R' j% M' k/ Y
    9 M( H  o- Q+ f# {6 Y% N
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    2 k5 ^. l9 Y- h; j8 a* \
    * l  }3 I4 z% X! D( P3 Q/ x  `数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧- A/ M- p: l/ e* D7 Y
    1 B- m, P* _' w8 x$ F
    最终事件的预测变量的线性组合就是:
    & q, Z! z) H9 i; e$ R# i  X* R7 d4 p1 _" j! ^. P
    . N  ~! b1 j, Y# U/ j4 K; {
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    1 f; G$ [& H  d6 S7 v; X( ?, v" J  {. H9 \9 ]+ T
    ln(odds) = ln(p/(1-p))
    $ |! a" x1 _2 R4 u. o- \, ], l9 y9 o
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    ; v2 F& K4 @4 G# `& I/ y6 C; `3 i2 A在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.5 R5 @. N, j, L! X* F4 u, c
    5 o6 U. {0 {* @' k# H, i
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    1 E0 H4 E# \/ O! r2 R
    , `7 ~" d' o0 m; z! V, ]1 A( A0 d5 B
    & N* R0 a5 J8 _. E& q; n. b# ]* P
    from sklearn.linear_model import LogisticRegression# Q, |) I# l% O; L0 `
      ?( w: n6 Q& @. R$ d9 A
    model = LogisticRegression()# S! a+ s0 y7 a  S! D! r7 f

    2 f0 U; K, e, @0 O # Train the model using the training sets and check score
    4 I; j* z8 i; }$ A model.fit(X, y)
    0 Y: `' t3 A: i4 f! m7 t5 q/ A model.score(X, y)
    % f4 `! W7 \. }- i
    , V: y# M/ o! y! n' O #Equation coefficient and Intercept- l: J/ U0 l% p
    print('Coefficient: \n', model.coef_)
    ! U0 ]; _# f# L- X# `/ w4 a9 W print('Intercept: \n', model.intercept_)
    % v5 u5 M$ B# t1 `" ?- D1 o+ N4 S% x+ ]. P- t" H# A  y
    #Predict Output
    8 y% N4 J3 v" x. a5 b8 ~ predicted= model.predict(x_test)5 q# B4 q0 m+ i9 m
    逻辑回归的优化:$ D! a2 w; e( ]6 P% G
    加入交互项3 z: Q' w8 j% x. z3 s! @* G

    ! R0 `$ }* I! m" a( v6 r2 \  减少特征变量
    ( o1 o7 ^! H% G# @
    1 l6 P# u5 W0 }9 ~* a  正则化
    " I0 q3 \8 m' a7 ]* ~7 F9 i
    ) B6 v( t% c) ^6 n9 L# r  使用非线性模型
    . Y/ a2 X7 v; r8 V  t
    ; R; b, K6 W, @# C3.决策树  O! {+ s" n( @, Y$ Z
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ; l0 V+ T9 c! h$ D; A
    1 U2 h& |3 q, R$ E! I8 U4 @) t* X; i7 j, b$ ~* Q3 v5 X
    ) {. {9 F' @1 f6 J
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。2 M  y; o" b0 ~' Q' a. w6 v4 [5 v0 D
    5 K$ q: X: T$ E9 K5 E) f* `, y

    4 S" I9 a0 h/ x; T; bfrom sklearn import tree& s6 s8 m! ~1 o0 }4 ?
    + U9 i+ ]3 W7 b
    ' O9 W+ M8 B% {) y, Q; K
    # Create tree object ) V2 U' r! w1 H
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    3 t( v* \0 M4 M, {. O7 R9 r4 I0 k4 p- A8 ?
    # model = tree.DecisionTreeRegressor() for regression
    + `4 g7 g4 J1 J7 I: t6 ?8 j/ D, M+ e2 ~7 o0 e$ {
    # Train the model using the training sets and check score0 G' E. ]# ]6 K- k, W8 ~% {
    model.fit(X, y): o0 P* M6 A9 T0 G) L- Y" n0 W
    model.score(X, y)
    7 w2 E( Y- O& n1 z) o) o, h  e' o/ ^5 V) b
    #Predict Output1 }( [) L( H1 `* o
    predicted= model.predict(x_test)3 Q, j0 x$ J' E6 _2 @8 L! s
    4. 支持向量机(SVM)
    , d& O) G( u( }9 g) G这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    5 @# i2 [4 j% x5 k; ]/ ^$ w
    % L+ p" w- b, @/ a# `7 X# b现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。. C, Y4 f  d. V' e1 ^- [2 n

    ) k- `- M' d  _; f' u& r
    , R. @5 s8 ]" b8 S, H$ ^* `: {, {3 L; l, a+ J8 t4 Q* E! V
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。& t! r# T6 M9 V0 M3 ~% r1 [

    + N  [. q' b: |#Import Library
    3 U# u' ?" F4 m" Jfrom sklearn import svm& s: L4 g& D9 i
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    - d, ^! O# {- e% X! i# Create SVM classification object
    6 }( R$ s5 B  A+ F3 o
    , ~$ R3 B* R* l; e9 Z# ]model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.' f( x. T; F8 C  J' x
    ) A; Z1 S# v6 S+ k( ^. q4 \
    # Train the model using the training sets and check score$ v$ U0 R( U" e  q9 G; j6 V/ g& g
    model.fit(X, y)" F# M: P- j" x4 P& I
    model.score(X, y)/ T% f+ ~( y, w) h( |3 a3 Y
    9 b9 W  A- g$ j1 Q6 a, v& b) o  O
    #Predict Output
    3 F+ X% M. U, X+ M8 @predicted= model.predict(x_test)
    ) d/ c# C4 V/ J1 S5. 朴素贝叶斯) \5 p5 k% l  [# u; ^9 I' b7 Z
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    ' q0 P- s% m: s. ?- c8 |1 T' r* `. Q* E4 v. t
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    6 C+ N1 S$ B1 g1 j7 n7 D8 `
    4 j/ K! U+ M3 Y/ N贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    ) h# D$ C+ i+ N+ R3 Q# }8 D" E. A1 \
    0 _* U5 ~4 O6 ~0 x8 q% J) X
    + n- X9 n# V, M, n9 \. O- }P(c|x)是已知特征x而分类为c的后验概率。' V6 u8 l2 q& F7 h0 B, T' u: ?

    " h9 z/ }5 \  e* S# G+ dP(c)是种类c的先验概率。$ _4 R9 ^# i0 ~; H( B( [
    8 O! J$ \  m1 m0 v* W) l" x0 j
    P(x|c)是种类c具有特征x的可能性。
    : H+ ]2 ~# C( C, M9 |" e3 [9 n% a9 y
    P(x)是特征x的先验概率。5 g% v( Z: O" H% T4 B) z
    0 Y5 `9 e& `: P( \- Y& o" a
      P  U& b- c% Y& g0 W9 i% U
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    1 B6 s' V3 j8 a# _! F# h+ C+ n* a0 m. L, r4 t% L
    步骤1:根据已知数据做频率表
    ) Y& r' I" V; T/ M9 S& K/ i8 W
    ! p. Y/ j2 n6 o9 i; a# C步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.5 e2 b% m  s3 t" C

    1 ?& p! [% L4 r6 ^; V7 y" p+ f/ f. W+ w) r( Z% \  q
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。) N1 S1 K; @1 u- b) S6 y8 j3 ^4 |
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    9 }9 c  N6 `: p  g& {2 d7 u* S. @( n
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。1 R" p$ D9 [/ ?/ h! o  C
    2 G" G8 Q1 B  Z/ f$ n7 Y5 e
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    $ d! x' b' K( R' P9 k) s4 q! }) s2 j  B8 y0 P( g# M, S- s3 d9 J
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    + R" C+ G& T% k6 s: e8 v6 G6 X
    " D4 e4 h6 O  L9 q1 l7 O当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。/ a( J0 a; u& p1 T: g5 W8 K0 ~2 `& N( f

    8 B4 d8 a7 X2 \! y! e5 Y2 W* v2 a#Import Library2 i; f, O( x) S: N+ F4 `1 M6 ^
    from sklearn.naive_bayes import GaussianNB+ W& d7 a6 W+ z2 N
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    - j. F9 K- O, s7 u! u1 p% V* ]* z; i6 j; a7 |
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link+ E0 [4 [. a( J  W# F5 f. w
    4 [) T' g+ c# H1 [& U( V  j* Z# Y
    # Train the model using the training sets and check score
    5 z; q' a/ A. m9 P6 K. lmodel.fit(X, y)
    6 n) c/ [- j( ^) w: V& s& E+ T/ `* t, T1 O& T
    #Predict Output
    7 i( {5 v  E/ I: r, `5 g: `predicted= model.predict(x_test)- `+ U7 O1 `3 ]2 P! X: y
    6.KNN(K-邻近算法)
    7 e4 p( Y: q- N6 q这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    . l: H* o) z7 \$ c1 f! u& V( g/ B9 g0 r! {) v) g8 G% `& O
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。# P3 }& Y2 @7 n% k6 _4 W
    ! W4 b& u. @/ P! e( s  l

      v7 q9 {! ^! Z/ Q
    8 s: i# \! Q* N3 |1 s) UKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    0 ^: K0 I7 d1 {1 R1 s- q7 `$ L, h; {5 u0 C, c) B
    在用KNN前你需要考虑到:6 j/ Z" e. n9 f1 K

    & i6 ?; x9 \, h" A" uKNN的计算成本很高+ G# g* S( V4 B

    ! u  G$ r% G  [4 G所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。1 ~  _0 N  u) U) u7 z7 @1 O
    . j! w& q9 s) r1 E. O
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    $ u- N; {4 q  Z2 e" E. M
    . |; j. ]* {5 h- P8 {( Y8 m#Import Library
    ) o; T1 l3 D6 @* afrom sklearn.neighbors import KNeighborsClassifier
    ! A! N7 W+ g+ Q% h" p
    # Q% U  n, n/ U, y* F* j/ d#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 X+ f( N9 O' z- }- \6 p, {
    # Create KNeighbors classifier object model 8 j3 C7 C2 `: g( \
    , E  ~; v, p* _- S( C, i
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    ( X$ R$ U- M% ]( _  @* P  V6 j4 d, r* o
    # Train the model using the training sets and check score: G: K* t, p. i, b5 \/ D
    model.fit(X, y)
    6 T1 O; u, P; P8 _6 e! ?
    6 T6 u+ |% }/ {+ z, f+ s9 T6 J% ?( n#Predict Output
    3 c+ x) H1 _; I. e5 d* j% f0 `predicted= model.predict(x_test)
    & M2 }  h' W# [# a! P7. K均值算法(K-Means)
    4 ?+ O- [' x4 ?! r- N' r" w: j0 a/ H这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    4 H% d8 M: L& t% E8 ~  N( K
    4 _  }/ h0 K* [, ], G( U9 j7 B2 e还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!3 ]" R  m( v% E

    # ?" W+ Z( f" |( z# S) ^
    7 {- {8 u' c( m9 h& C8 Q+ yK均值算法如何划分集群:
    # w) n* j! A, x% u! I* i
    2 A1 K( S& w" A' T/ B! M+ M
    ! i4 x9 {; }: w7 S& V' Y. b( N& e6 L, O" S
    从每个集群中选取K个数据点作为质心(centroids)。
    : G- F% M6 I7 z! T5 y, J
    " f% o# b6 m8 c, P4 n! E# j  I2 c将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。+ Z6 f6 Z. o, U. P

    / k  _! Q, j5 r! j; V找出新集群的质心,这样就有了新的质心。1 B4 p& ^5 l. i# r0 j/ i# K
      C2 O* Q8 @9 B) f5 c- X: e
    重复2和3,直到结果收敛,即不再有新的质心出现。) J3 |7 q, F7 G- C& I
    ( m( R; j# C- n' J. ]8 ]3 e/ m
    & H8 ]8 b2 X2 ^3 U/ f6 s! V4 v
    怎样确定K的值:5 T4 J) W  v- z8 ^8 o) K* R( V" Y
    2 f! r. Q3 n8 v; F4 F  O
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    8 x% Z/ N7 d( o, p, C+ c5 P& E) u, h: Y$ s. `+ q
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。- g% ^$ \& h# l& p7 W
    3 o! S9 P# M$ H( X; f; q
    ' r- k, z7 ?6 W9 [( u% b
    #Import Library
      k& g/ }, s6 ffrom sklearn.cluster import KMeans
    4 `7 V. b" _; N, f% y: ]. J. O# H  p4 G9 c: g
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset5 k" r: K  x$ n. K( U
    # Create KNeighbors classifier object model 7 `6 ~# R/ A& D2 K6 U7 q# l
    k_means = KMeans(n_clusters=3, random_state=0)
    2 S2 z, B# C+ D$ m- [
    + g5 l8 x5 a  u9 p  G# Train the model using the training sets and check score
    + v( o. |' N8 Bmodel.fit(X)% w- P$ h9 b- S5 }. D4 X# V' e% S

    8 Q/ T1 y8 y# i4 k' C* v#Predict Output  h6 ]% L/ ?" N: v) ^' J; Q
    predicted= model.predict(x_test)
    ' S$ G  m- L- x; q2 i8.随机森林! P3 E/ j9 y# |. z# n" W6 N' G
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。$ _3 k! b% j( O+ b# U* w$ x. [
    ) K& h# O/ R2 A/ w7 ]& Z' {" q& p8 t
    怎样生成决策树:
    ' K6 I: {4 _( |0 v+ ?% }$ o9 ~6 W: U
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。" @% q" @& r# d" x$ z1 V- A

      v0 T' i0 d$ Q( z2 z9 n2 j如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。4 G' L* A7 s- q, |" u/ N
    7 e( @. }" e' a* u) F
    每个决策树都最大程度上进行分割,没有剪枝。1 e7 b: J9 u% ]9 P0 Y1 ]
    ! N: L5 H2 Z7 M+ v! Z% ]) f$ q
    #Import Library
    9 J) c) c0 B8 c% ifrom sklearn.ensemble import RandomForestClassifier
    7 ~# ^: x+ b& t$ Q% G& x" s#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    4 Y' ?4 V& a" N( p- N: K5 |5 ~6 @) ]) v% a# X. }2 u
    # Create Random Forest object
    % l! Y$ ^6 O  Tmodel= RandomForestClassifier()1 ^4 u: V' K3 e* O
    3 Q0 P+ |1 G, `2 n. h0 q( P$ H- e
    # Train the model using the training sets and check score
    4 O! B6 c' }& S) g- Kmodel.fit(X, y)+ k% s8 I0 F; u8 i. k2 m* r: o
    9 l9 O7 D' @9 `) V$ T  ]
    #Predict Output
    6 F- N( ?4 J( V: B* Z$ B" z* Mpredicted= model.predict(x_test)  O5 I" F# ?: a/ G
    9.降维算法(Dimensionality Reduction Algorithms)
    3 X! o) T+ M' F2 C4 T! ^在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。0 g. j5 @- S$ E3 N
    2 P" R! g+ Y, H, P) X
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。! Z9 r+ t% q: I  F4 V# I& j
    ) B. B# A0 Q: l
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。- I) }; d  j$ b4 h

    7 H- k  k! H/ p9 \, u: |- c* R  L2 ^5 }+ x
    #Import Library
    8 ]- v) o2 x6 X  [- c9 @+ ~from sklearn import decomposition+ Q- u5 v5 P) |* Y- O
    #Assumed you have training and test data set as train and test
    . a, `% V) V: C6 O% s8 x# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features); u6 P( |" u2 ?0 Q1 H% y
    # For Factor analysis* }7 Q* O9 _* E% {
    #fa= decomposition.FactorAnalysis()+ C. f) Q; {9 j+ [6 Q& U
    # Reduced the dimension of training dataset using PCA1 _8 \  d0 V. {  t! {
    , c# ~& Q# U& b& q
    train_reduced = pca.fit_transform(train)# A& F: k; p' r/ H6 m# R

    . L7 j- f" W. z' H) I8 M#Reduced the dimension of test dataset; D, ]# ]1 @2 ~* m+ {9 B( J7 @, h
    test_reduced = pca.transform(test)! H* g* x: c  M
    10.Gradient Boosing 和 AdaBoost4 f4 \; }/ d; a+ p) G2 L$ X3 b: S, G
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    & S2 O7 y6 ~% a3 O: U) V% b5 r, z4 \3 p5 a% }0 [, ^+ E8 [
    #Import Library2 I: K* ]+ |7 P7 A) m( B, V
    from sklearn.ensemble import GradientBoostingClassifier; d4 x' j& ~. t! d0 M/ K
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ! {! i) H! [3 K# D( J3 [# Create Gradient Boosting Classifier object
    5 V- Z5 g9 C4 p8 {model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)" z: T( e7 q! n+ M

    ) ^! ^& ^5 n0 L( K8 H: q  b# Train the model using the training sets and check score
    ( I1 W/ R9 v; ?& D4 b! S$ G) Lmodel.fit(X, y)
    : w! g* O( c: |! p; B#Predict Output
    " Q* W! q% Y; B- _predicted= model.predict(x_test)
    % s1 z+ r: Y  f  aGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    9 ]; _, f: H5 G2 }2 T  C: b6 k1 T. w6 O; U
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386( q5 Z7 X* o% I; V9 ^5 C
    ————————————————
    6 a: ]% O, B, k/ M0 }. y* y版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 A5 i* Z6 [. S" k; _; b
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    ( M2 Z" u/ y( C* F
    ! S- D1 c6 m* Z, Y, }1 z
    ) ~/ s! N' a0 F' `8 W" t4 J2 a6 y
    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 18:25 , Processed in 0.428028 second(s), 51 queries .

    回顶部