QQ登录

只需要一步,快速开始

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

    4 v$ ~7 ~( i5 O5 Q' S8 T, L机器学习算法整理(内含代码)
    3 Y  h8 m$ u( `# G: V' j( K. H+ [
    6 M  a* j' j/ m$ F+ `一般来说,机器学习有三种算法:6 n, O6 m: q) r# W! A
    - R# {9 U* A5 G4 m
    1.监督式学习1 ?+ _0 E$ e' M- w

    ) J- k. O9 I8 t 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
      c+ h! d: P6 [1 i/ f; n) e9 [% d
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
      Z2 M+ u& ?1 H6 Z/ e$ u9 j& s; O" E
    2.无监督式算法
    ( u3 `& t" w( v0 V, q, g6 V6 g" ?6 l+ k, `7 M5 i
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    8 x! }2 s; h. r$ W" p7 ?
    , V6 \6 g) u" g! z( {3 F9 ~  P属于无监督式学习的算法有:关联规则,K-means聚类算法等/ D* f8 F. O& j% E+ e* g

    ! n) o6 Z8 n% V3.强化学习" P/ [: h: G3 N: l& k
      K. y/ ^& h2 O
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定3 L8 P2 v0 l- @6 ^8 m

    1 |9 p/ @+ p0 i% m属于强化学习的算法有:马尔可夫决策过程
    ( ]( L' O2 g5 u8 ]5 e) S; Q: U4 w2 }1 A/ }! Q. u& Z
    常见的机器学习算法有:; j. D. |, \0 E( G* |8 t% m
    7 i# t+ H: k8 Q6 f- K/ D

    ( `$ R( C) w$ J7 \1.线性回归 (Linear Regression)7 p% {+ j! X, Y$ c

    / E7 _" v* w5 V2 H, m: p2.逻辑回归 (Logistic Regression)3 `4 H8 U% k. h/ m: i9 x7 T& U
    9 t* l' O. v( \
    3.决策树 (Decision Tree)
      {3 r6 E/ O" R. ]
    1 a; ~0 I# U! e  D4.支持向量机(SVM)9 d& D/ m3 |8 `* i

    / D- M; K1 v8 q( C5.朴素贝叶斯 (Naive Bayes)' ~- e  \9 K. t4 d6 A0 N) S

    : I- A+ [1 p7 b0 u, v8 f* n6.K邻近算法(KNN)" [( f& T( X1 U# S. z3 x" v

    , u  o. s; t0 f7.K-均值算法(K-means)5 a; V+ m- B; O3 i, j- s
    ' ~8 h* ?. s/ a! r0 V, \
    8.随机森林 (Random Forest)
    3 ~2 o; R; O6 U( M( h
    9 m1 D, U: C+ ~* C3 T. Y9.降低维度算法(Dimensionality Reduction Algorithms), M- X) A2 ?1 D3 E* A. g3 g
    ; Z3 `( \0 ]' E7 q1 O
    10.Gradient Boost和Adaboost算法
    % d7 B7 z" o  M一个一个来说:
    4 E# N& B* Z8 j( s7 t/ l, {1.线性回归
    6 x' z" L! \1 W7 q$ f
      `5 q1 S$ I# O9 y" `/ N, {线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示." Q3 q5 F  s/ P* Y: R- Y% ~. K

    & V2 g; H0 e$ N3 ]: Y在这个Y=ax+b这个公式里:
    % Z3 v9 R) g  S4 e! A: }2 S
    7 Y( f* _% N, ~, i3 f Y=因变量4 J. g0 s: y/ H

    " g5 a  M& y5 m1 {" J! {5 R a =斜率5 Y& W/ d( O" ]% X

    8 i/ Q" h! \5 W5 @* [6 W x=自变量
    0 Q. G# B* R, t$ S+ w, d4 R9 H3 h3 [! r
    b=截距% Q& h! Y% c) w" B  j% O6 ^

    ) B5 T+ k$ J8 W# e% K a和b可以通过最下化因变量误差的平方和得到(最小二乘法)  f( ~2 }$ [* E9 w& d- X' n: s' W
    3 s3 k" V2 H) M% b' @! h
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。, L8 ^6 i! x% w( [! ^
    * N" I9 }  P( n; B) w; f4 q
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    " A: D% i2 Z/ I8 i8 G' c
    1 \& d$ T! J& a' r/ D0 R7 R
    $ L8 m1 G( e. n
    0 T4 D) v9 b/ G+ C5 Y, r0 _线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    - d  |  ?8 F2 k$ I' k
    * N% `( |' P) y: P! z拟合多元线性回归的时候,可以利用多项式回归或曲线回归% ~  g# M" j7 t

    , }% [% m* E4 X, u0 Q3 iImport Library% E. {4 `  k6 |8 H& j+ P3 A
    from sklearn import linear_model" k* P* ~; {- s* F: y2 s; g9 m

    7 g# k; a1 ?1 A2 U5 @" {6 ]x_train=input_variables_values_training_datasets
    0 |6 [1 M& \$ \5 ]' Ty_train=target_variables_values_training_datasets0 I$ X7 r" |( V5 o" I& Y9 V
    x_test=input_variables_values_test_datasets
    # B5 e, @+ ^) f" ~; ^, p6 l7 F+ ?! G! v, U% f7 Z: M& y2 q
    # Create linear regression object
    % K- K3 M( h* Y# xlinear = linear_model.LinearRegression()
    9 v. F  [1 b1 g" t0 ~
    ; `8 r; [& u6 z, V, ^2 B( k9 w# Train the model using the training sets and check score
      `+ ]+ K+ S9 @; \8 H0 vlinear.fit(x_train, y_train)9 W9 z1 O$ s3 |- k
    linear.score(x_train, y_train)
    ! y2 Y. V6 S5 e, N8 z% w1 ]: }1 `+ ^. V; X* Y
    #Equation coefficient and Intercept
    4 z6 t) Q: ]: y) o+ E+ T: Oprint('Coefficient: \n', linear.coef_)
    1 A3 H5 |7 O; Y3 b& tprint('Intercept: \n', linear.intercept_)
    % h) ~2 u. a1 {) z* f" F- m0 L  q) J' M
    #Predict Output: e( ?4 H9 S1 u" j8 L* L
    predicted= linear.predict(x_test)
    $ @7 j" t6 S7 b2.逻辑回归
    7 Y  d" N7 ]* U3 r! o" o- r逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    " d/ F$ S5 {  B( \! [- ^# j) @: e4 H& L* s
    同样用例子来理解:
    % c5 ~% z' r8 X: Y! D; f/ ]6 ?* _- L: I6 J! J3 v; v4 {+ [4 d2 Q
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。( w6 S: T, H1 I. t* v

    ; Z! }7 ~1 K* f+ s" m' u1 S数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧- ^1 C" m2 F% F+ z" P5 m4 f: P

    8 n1 |3 w: Y/ V" D  {最终事件的预测变量的线性组合就是:
    / h1 s5 a) o" j5 j: x8 I5 T7 f! j, w2 {( G2 @! {! @: K& x2 L6 k3 ]

    0 c+ T7 b' e' aodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    , O* ?- }: E/ b0 N& `- a4 y  i: E7 Z: T/ L! T
    ln(odds) = ln(p/(1-p))0 f% U  X3 z# y, B$ Q

    5 _) |# U7 v1 \  L5 Qlogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
      t" ^4 [  O4 ]4 ^. _+ y+ F8 A+ t在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    % Q2 z/ h0 V+ u8 x- ~% L& t+ J2 ?9 [* c; l
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.3 h; b& M# M# c/ S1 Y

    : L0 r0 J* }% I, @, E3 G  J/ y, n: i+ h. U. f: b
    . A2 U1 i; o( u! m; E; e; j7 q
    from sklearn.linear_model import LogisticRegression
    8 N1 @# ~) W& ~( w8 d
    4 ]0 z; |; ?8 W" n) a model = LogisticRegression(), B; }/ Z4 x0 H) j
    ( \7 p% k7 c( B% B) k9 x: f( F
    # Train the model using the training sets and check score" E5 `& q! `- ]
    model.fit(X, y)
    % t1 J; Y3 b" d1 I model.score(X, y)9 w" A4 D6 {; d6 i: ^1 d9 \- `8 e: U

    ' A; J$ D1 O) m$ D #Equation coefficient and Intercept
    2 D! j. I; B% m6 c+ B7 I7 R# @: H9 x  O print('Coefficient: \n', model.coef_)
    * u8 e! w5 a  o print('Intercept: \n', model.intercept_)! o' V/ @) x2 [4 {5 L
    2 p9 W& V  W3 z$ T
    #Predict Output& }+ |. j& t6 R+ h( s3 t
    predicted= model.predict(x_test)
    0 B! k$ w, \4 t5 U8 \4 x; M5 c1 u逻辑回归的优化:
    . o  J/ Q# O3 Z) Y1 `加入交互项
    & {2 M" R! _1 I1 T$ a) A
    % o1 O. L. {  M) r+ P  减少特征变量5 R) t3 f0 d; \3 k
    ) D1 I# {8 G$ S8 @/ C' m
      正则化$ _- l& u# q7 }9 [; u( j7 h

    5 J% Q# c% `2 ~$ r7 J  v; ]3 K  使用非线性模型$ y, v3 x" D7 ~
    5 |, f$ N3 z+ s7 ]
    3.决策树$ U4 p4 O+ ?- @- |
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    " G5 f& a. a& g; k: s* h8 m2 ]- o5 I* ^# M

    - q9 L2 H6 G0 u( L8 Z' x  W, V; X/ l4 G3 M/ I- V4 k: I* i7 R: E
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    1 A9 o, U% t/ H! T; ^5 w+ K2 p  p; L. V& o
    3 M( P; P1 f2 c! j7 M8 Q5 K& r
    from sklearn import tree7 p0 h. q! s8 T0 e+ Y* [4 e

    0 B' B' K" u! C% j4 Y! h4 j0 s1 {- d3 _/ C% c2 U8 F
    # Create tree object & T8 c3 p0 y! l" `- x" z" r; Q
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    , f+ ~) A9 a; l3 z/ H3 y8 N' I* D7 D! T' k
    # model = tree.DecisionTreeRegressor() for regression
    , W1 m1 z' L" W2 o" G( m% @! P4 l$ g0 t# Y& H; w
    # Train the model using the training sets and check score1 O; ^$ Q$ n4 I& O
    model.fit(X, y); m6 @; a. f, i1 }0 L/ i% L, N
    model.score(X, y)
    : v1 v* i  J* d: t0 Y9 Q$ R. t; A4 A
    #Predict Output
    7 @9 H3 A1 B5 [9 |! ]predicted= model.predict(x_test)' w8 D) z% b6 l! a, b* p
    4. 支持向量机(SVM)! e' ^6 z2 ~! v9 }; ^1 ]1 B- a
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。; r. {5 T( Z9 Q
    ' L+ l7 f  _" `
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    ; b4 n; n( B+ F( o3 M- }2 i  c5 r) X. A1 N" f+ B

      S0 v& N+ B( p+ E' F+ ^; F$ e  A
    " ?3 N  ?6 R/ S3 ~, ?在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。; M  d, M- h" Y4 x8 t

    , d4 Q* U* H3 k6 N#Import Library: Y% A6 g  p" k6 D! i# }
    from sklearn import svm* `2 |) \2 _, C
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 [3 _6 ]3 C5 v
    # Create SVM classification object
    ; L: E' J) s2 O& z. {3 p$ K: l! N8 F7 f; S. U8 J
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    ' [; G* x. L, |# u7 Y/ C0 Y8 l- [4 i; X. E" |2 c+ B
    # Train the model using the training sets and check score
    # C: _( M- |1 n1 M- X9 \/ jmodel.fit(X, y)
    7 V3 ^5 ~  r9 ~( r6 _model.score(X, y)
    4 O3 }) _5 Z  I
    - l+ a; E8 t$ g#Predict Output( c) p5 e! ?6 I" T6 |  x+ Y/ b
    predicted= model.predict(x_test)3 x+ @+ c# C# R8 p: \9 Z6 U" L
    5. 朴素贝叶斯
    . f: [+ S" f8 ^  u3 E( W  x' p$ y这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    - Z0 ^. w5 B* [: K5 p& e
    " f; W  N& w' B7 \3 v# u0 d* j朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    4 q  w5 p- s' o& I7 I; F1 E8 a/ V7 ^
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    ; ?$ o# o, A# M5 q1 a& K) |
    - O8 ~& A. Q# u5 i2 e/ Q$ E9 E# ~9 r& S4 {" g7 ]
    P(c|x)是已知特征x而分类为c的后验概率。
    " y% E, H4 k$ i+ B) J8 w; r% M/ i+ M4 s. A
    P(c)是种类c的先验概率。( q' P- A0 X! t+ n6 \  Q7 ]
    3 X* ~* s5 g3 {* U9 A3 o& `  i) f
    P(x|c)是种类c具有特征x的可能性。: s3 f* Y$ E$ _6 h
    6 \- e, l0 Z5 a
    P(x)是特征x的先验概率。
    - z& E* F- ]" `7 w1 _% z' S, U: G3 w7 c

    7 {" N) e0 B* C7 O8 K+ E例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    1 c- w3 w% ~; u2 _" X8 Z' `/ y8 m4 i
    步骤1:根据已知数据做频率表; O5 r- x7 Y7 |: _  S
    / o5 c) b- a+ N$ c9 X) R4 |
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    1 `3 h& }2 @* `. e+ ?  V- k  _: i( b

    4 s) K% Z1 u( i/ o9 J  t% L7 E步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    + l5 y5 ]* ^2 F* }提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    ; R' K, v* @3 h' ~
    ) Y: u5 K4 {: O6 W我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    / l# o8 V) F) o* O6 n; v
    - F- ^" V2 @; N9 Z& ]) ~这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。+ v9 _7 u  H" f) F' w

    0 u& `% ^( Q2 G/ ?; w/ v. s# T) W那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。) t: T0 h9 c5 y! Z" ~

    9 S' M" z% s$ H! E& v3 Z6 e% Y当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。, }7 ~' o6 p# e6 P: J

    4 q( d8 Y( }3 a6 M3 ?6 H/ Y#Import Library
    + B/ q8 f  g( c6 k7 ?8 P% Wfrom sklearn.naive_bayes import GaussianNB2 D9 z0 Q: S0 q# c3 m$ O
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset; H% O' {( v2 d: Y5 j3 X2 }

    2 y3 L, \6 J* N. S- P, l% N4 }' t# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link) t" q7 p9 Y9 r6 X1 R; l

    3 K4 y6 _3 X+ B# Train the model using the training sets and check score0 b4 r9 D# k) L* `/ w
    model.fit(X, y)
    + i! J; j4 w9 P2 I; _8 A( ~! }  i+ K- m" w- M
    #Predict Output( v! d$ H( u5 l5 `; q5 U8 ~5 \" I
    predicted= model.predict(x_test)
    # t/ p9 q: L4 V9 ]7 H, D6.KNN(K-邻近算法)
    : v& M6 ?/ |. Y5 ?! o7 G' `这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    4 d' @! h: |- S7 Q% [5 h" B
    , a- g8 \( ]% ?( N7 ~/ }9 A距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    & {7 U& l, {% {2 l* }! ?& k  [" C; ^5 s. A) |, B* B

    " X; H# D' r& Q% e: z' @0 p/ ^* v
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。" p6 H+ F7 H- w& |8 S
    6 Q: @! K1 e; l5 u4 A3 ?& l
    在用KNN前你需要考虑到:- r$ b- P; @. ^3 |4 e: w, B
    0 a  M, z; b/ i% G7 q  j$ v4 c
    KNN的计算成本很高2 U$ i# x5 r, w# E7 e; y+ C
    9 @: Z) ]- ~# X9 B2 T4 b  E
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。9 O6 r, E9 k- B4 G
    & d1 x+ K) c  p
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    8 y- a) ?- ~3 w6 J6 x5 i% h7 a) o) W5 t3 `( W6 Z; o: g" F
    #Import Library1 u7 r7 h4 h% t1 R4 T( C5 T' L
    from sklearn.neighbors import KNeighborsClassifier! M6 R$ i1 A6 C" Y( o# d

    / |# f  H) ^& _% u- a4 [3 V" z! F* E#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset( A% A9 q) ~4 F% {1 h, D
    # Create KNeighbors classifier object model
    ) b) N" t: P# Y; O0 N5 h. d8 A1 _: i- i+ `! A1 A$ Y! [
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5) s" C* N& b/ M

    0 b# T5 R9 a5 O# Train the model using the training sets and check score
    + M: S0 [: v6 ]3 [5 D" Imodel.fit(X, y)& z3 @* \8 I, ^6 ]; Z& o
    ! }4 x6 j9 u0 a" N
    #Predict Output/ L& f( e$ {3 w4 X/ S" _- ^
    predicted= model.predict(x_test)
    % F9 c* o* n) P! n! T0 t7. K均值算法(K-Means)
    9 k3 d2 j, |# q1 U* }这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    * t' u7 r0 D( p- G3 [! u& c% h
    : @: G, T1 P7 U9 B还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!$ A; g* ^3 N7 g
    ' E9 v. k' Y3 N7 m* h- I* _

    $ w+ p- g; U4 L) ?! }K均值算法如何划分集群:
    * K5 z2 o: z5 s3 E& ?0 W& E- ]
    8 o& M" o, ^7 h" ?3 i
    - E$ F5 S& E# f( w& F; T+ L6 q
    2 F0 N: U5 G, J2 s1 B6 Z( F9 R从每个集群中选取K个数据点作为质心(centroids)。
      Y" ^( s, L' w+ l% [
    * b1 U& Y0 L, G4 F. J4 j; E' X1 W/ m将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    : N( P7 `$ _; \6 @1 e4 p! ~/ q1 i' _
    找出新集群的质心,这样就有了新的质心。
    ) c/ }5 s7 w& H0 {6 r) t0 l# ]; e# b+ P% m/ i* J3 y! a* Y, ~. ~
    重复2和3,直到结果收敛,即不再有新的质心出现。
    5 o" u4 @/ l3 V# i
    $ l( @. h8 T8 C  ]( g: M, i
    , g& O0 v6 {3 l3 ^- |# O怎样确定K的值:
    % c6 K! H( b; i. e/ ^+ w! E) z; N% ~  i6 \5 t& }) z& B$ ]
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    " @3 A. O- C- z- K+ J# g; n( l  b
    4 ~/ \( P0 d: V  O我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    ; Y" d- t9 Z  V0 Z1 [
    3 `2 W' t8 V( i6 S/ N! b5 j6 z6 V( ?* w, D, `; f/ F
    #Import Library
    - m- E: y; v7 C# [3 R' G  T  B: Wfrom sklearn.cluster import KMeans
    3 B- P$ @- @: p
    5 f& p) Q5 m( j0 m; c0 R4 M( P& r#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    % c2 A* v8 l+ G" Y' B/ F3 v: a# Create KNeighbors classifier object model
    1 f  X# E. q" j8 C' qk_means = KMeans(n_clusters=3, random_state=0)) ~  b- S6 n7 M* [6 c9 P
    ( [" {3 E# s0 r2 C' R
    # Train the model using the training sets and check score0 ], U0 e! a+ x5 x
    model.fit(X)3 n) F* G, A7 S" d* c
    0 J8 c4 n1 K5 S! j. l+ G  R7 x) Y
    #Predict Output( t( B4 s# }" H% B3 _
    predicted= model.predict(x_test)4 |$ y( u1 t& m2 p5 G
    8.随机森林; \( E' ?) f9 R
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    & u' [# O  Z- ~5 V. D' |. T" H# ?5 w' P
    怎样生成决策树:
    * }5 F0 ?* Z8 ^9 J3 E$ F8 D; N7 j! ~
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    & c( D/ @! o! }3 i& X! m2 D, E9 C8 s
    9 [# x$ l, n/ a1 _# m/ w/ n( u8 G如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。+ ~6 R  P, T2 h3 o* K' G& R

    * }+ n8 K: V5 U: h% d每个决策树都最大程度上进行分割,没有剪枝。2 H) i$ W. r8 M4 j9 d  D; _
    - M) E/ \( S; G! j
    #Import Library
    ) U9 }8 v2 l  Nfrom sklearn.ensemble import RandomForestClassifier
    ( X8 M: j8 ^8 Q/ w" o8 S$ n4 ~#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    * Y8 W  T/ ^9 T7 d% U+ L# k9 j
      i# [7 ?/ G' o- A) v$ i9 ~! Z# Create Random Forest object
    4 j' S; K$ X# m. \+ ?" E. {model= RandomForestClassifier()" k2 I* a/ o5 t- A2 D

    # V9 o( g) H+ P) u& ]7 \. j# Train the model using the training sets and check score, C- `) P& K( F
    model.fit(X, y)
    + {( u, R& e3 O) i  ^: U% E" z' E+ s( M: v" [' k
    #Predict Output% q4 [7 W# P5 ]9 [" d" J# A. b( j, G
    predicted= model.predict(x_test)2 N1 _) r# m- y
    9.降维算法(Dimensionality Reduction Algorithms)* w, ~2 ]0 {* z* M# |
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
      o% j: F7 d( p5 K9 }/ p4 b0 X9 T4 I5 n' ?5 ~* ~! x
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。0 T2 V, {3 D  [1 g9 N0 k

    6 p- q( \$ Q5 f4 [, g) J作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。7 W3 i- T$ V8 ]& D" |

    1 U; M  ?/ ^* ]( |8 J
    : d! Q' B% x) e#Import Library
    % f+ P# L2 v: zfrom sklearn import decomposition
    3 {6 |, _" U- T! C#Assumed you have training and test data set as train and test
    - u( L1 u, Y  u# ?# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)" u0 M# K9 Q* E0 \2 K* Y3 L+ v
    # For Factor analysis! |' z% y% A, Q, [' W
    #fa= decomposition.FactorAnalysis(). U; Q3 g8 \2 E0 D. c6 }$ Y+ d1 }  V
    # Reduced the dimension of training dataset using PCA
    + V# s# C5 q: p- i9 s4 F
    4 m% N) z: K0 w& Atrain_reduced = pca.fit_transform(train)9 D8 n- a3 C/ H. R6 g, H* [

    9 w6 Y) q/ n- r. l  K! m* B3 u#Reduced the dimension of test dataset) c. O+ \$ A* I# D( \! O! j
    test_reduced = pca.transform(test)6 T6 i; y9 l  I
    10.Gradient Boosing 和 AdaBoost
    * r) z* C  z6 k# m0 |- w! p1 V7 I. pGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    7 a7 r$ U! Z+ M) H% {# N$ ^; o' z. m! F+ n* }
    #Import Library
    ! @2 y/ K* R( R( _from sklearn.ensemble import GradientBoostingClassifier6 O1 }4 |6 [/ q/ [3 J, Y
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset( k9 G; `. x' G  I9 s1 O. p
    # Create Gradient Boosting Classifier object
    0 y  l% z( y8 `5 V& P& wmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    . S1 A4 L$ B" K* s; k
    , y6 `$ c' a; B$ u* B# Train the model using the training sets and check score
    8 B$ c& X8 j, r: L3 Bmodel.fit(X, y)
    , n5 a; w7 n, ]) `1 B3 l' q# D#Predict Output
    9 T& O5 n' g! v( d7 _predicted= model.predict(x_test). `' k/ @/ n$ U8 h" z
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    & c$ n" p& U7 `' `, w5 T" |, P$ B+ G8 F9 }6 N( r0 O$ }( l8 n5 R& y
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386" g( o6 K, t, p; a. B6 b+ @
    ————————————————
    3 l6 N7 w9 S- p. d7 O: `4 E3 k版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . M# d+ I; A- p6 m原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075  p  _. Y6 s% v$ ^/ \
    & M" a5 |3 D2 v5 {  G* O/ w
    - e: d. Z$ z) r( K3 Z+ A- {
    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 17:20 , Processed in 0.634912 second(s), 51 queries .

    回顶部