QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2192|回复: 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
    & D. K9 x1 o/ U4 S% N) k3 t
    机器学习算法整理(内含代码): s, t2 l8 B* l% m, y  g' x

    5 ~% p$ R' B3 c, ]) z一般来说,机器学习有三种算法:
    - ]/ V5 }& R( s& o' t- ^  N: Y( N( p  b7 Z
    1.监督式学习
    & r6 k1 t8 T8 w0 E) }. @  a0 W$ @& B8 _, B9 }8 `" t
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    3 g' ]. O+ a3 {5 V* c2 ]$ v) z: ^' j
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    ; V- m7 h# I% R+ ~5 _* I7 u% z; [% A: ~" }* M1 j& \
    2.无监督式算法
    ! _. y* q  E6 O3 x. S! n% w3 P
    , X7 r% i) Q9 e/ m$ G) ~3 L' f无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.5 M# C' [5 O6 G  ]# ?
    0 z8 B+ E  C; [3 s, T) }- {$ ?
    属于无监督式学习的算法有:关联规则,K-means聚类算法等6 f. M. ?, P/ y2 j+ g& F/ F
    ' c) Z$ v+ }$ i  f% E  n% r# @
    3.强化学习
    . z* ?- n9 F# w4 a$ ?! t' [7 o6 x8 G7 k* D* Q0 L
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定) S) Q! y, I0 c5 ]( T4 l

    " {# h4 r! ~$ x7 B, Z/ e, G# K属于强化学习的算法有:马尔可夫决策过程2 Y; l2 Z  ]$ x/ p$ O* F

    $ K3 ]' b* @. y& _常见的机器学习算法有:; C$ M0 n4 D& e  |# B
    + R2 h: o0 Z2 j* [# l3 y+ e. s
    7 q* T7 s) c4 }! [
    1.线性回归 (Linear Regression)
    2 O% D1 x1 Z5 Z
    % u, C! b) Z& |& u$ [2 b6 y2.逻辑回归 (Logistic Regression)
    1 Y8 |: D5 j$ y% o. s" I2 t; ?" f7 ~2 D) t/ D5 }6 L  N, t
    3.决策树 (Decision Tree)( K0 I2 q  d5 |6 S

    % d$ n; J( _9 J! M. a- z/ r4.支持向量机(SVM)
      l" b/ K8 M) `7 H/ B7 q1 h$ K) d( R' [; J' H2 v8 v# `8 y! Z
    5.朴素贝叶斯 (Naive Bayes)  q: [  A  D* j2 y, C; u1 b

    ' L& r4 x0 x; e: ~! U6.K邻近算法(KNN)4 y1 r7 X+ G8 a

    & r  H0 ?6 o0 F8 I5 A7.K-均值算法(K-means)! U6 [! @, |" m7 e) t" A
    0 s/ a4 R/ U* Q
    8.随机森林 (Random Forest)) [, q  Q) g( ^9 m, ^
    , p: H) s1 W4 p. y* J
    9.降低维度算法(Dimensionality Reduction Algorithms)* D8 g( {$ d  K1 {

    " ^/ ?7 M# @( R# ^. _# R10.Gradient Boost和Adaboost算法
    * j/ I% \7 f  @" u. T一个一个来说:1 S9 T( G" I; ~% L
    1.线性回归5 _3 t4 x! P' D+ j& j5 b8 g
    0 [! G6 R% ]3 C: @+ A
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.' U9 o' Z- G5 V# o0 x  `
    # L, p- ~* p' _9 Y, D1 Q6 q; B
    在这个Y=ax+b这个公式里:" l! Y$ {, B! d. I5 w$ G/ y
    7 H) S* w+ d  L2 }9 T8 K& b4 P- h
    Y=因变量, S) \$ U7 q  }4 K+ e% E# Q- M3 V
    # e0 ^2 R- p6 U+ R& |% M7 Z
    a =斜率
    ) \2 D: k* _4 ?( G4 d3 s: j7 y" U' D2 A" ^0 T6 a; g
    x=自变量
    ' Q8 X# w2 N- _) t  T# m, Q$ q+ s4 K( a
    b=截距- P- d0 A* ]- Z, h, @% L) Z8 H5 d, h1 P
    : w  l1 v7 r) w( _  T- d
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    8 p# C2 Z; g- B0 c' g
    $ E9 v. g* {2 i: o3 M% n我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    1 ~) m9 l  m/ |. g2 L) |2 F% j
    " w* Z5 q; S$ }0 M7 }8 g* Z/ I给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.# v1 n8 v3 V8 N- [  ?) C

    * \% H2 e: Y$ Z/ l6 U
    ; S3 U/ ^- @" l/ H5 _8 N% N! i) W9 o8 l  o6 m
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    + h4 p" z2 p6 ?6 N
    ! Y0 ^# Z# [; J3 t拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    1 }2 C+ v/ E% o2 C0 W6 Q
    5 p: O* Q" |) t1 K2 W1 u+ EImport Library
    - Z# C' Q( W, C) H0 w1 {7 Ffrom sklearn import linear_model, x" b# v/ L3 E$ K2 {7 Q& E

    ( j; p8 h& S) ?7 b+ T0 \, ox_train=input_variables_values_training_datasets: Z% X& f% e3 ]
    y_train=target_variables_values_training_datasets
    : x8 ~5 F. |4 M% Mx_test=input_variables_values_test_datasets
    . e6 i) _6 Q% G8 ?$ B+ C; g- O8 t% m: }1 b' K) |: t0 ~+ G1 \
    # Create linear regression object
    6 e  E* z! Q/ E7 Y" tlinear = linear_model.LinearRegression()7 ^+ {- u6 ~2 b) z' S, }0 N: d' n

    & k" S& R7 c3 E" Y- c# Train the model using the training sets and check score
    5 P; m$ G4 p9 |1 a8 vlinear.fit(x_train, y_train)' g, r6 E- P! \% R
    linear.score(x_train, y_train)$ M9 m9 O* @0 j

    7 q& x% G+ Y/ l' h3 ]- K" i#Equation coefficient and Intercept
    3 L9 w1 i! E, O- F7 l9 qprint('Coefficient: \n', linear.coef_)7 V# q/ X5 c0 C* l1 w
    print('Intercept: \n', linear.intercept_)1 F! X4 P9 T4 v! T% u
    3 ]0 _! ^8 J: ]2 p  j! F# l  o
    #Predict Output
    5 |$ T& L/ \8 T6 ^5 @! M2 o) vpredicted= linear.predict(x_test)
    / F) ^) X  m+ z  H; X; d1 j2.逻辑回归
    / d: B. h) v1 |3 C- P逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    9 o3 M6 B& G/ c  Y8 d1 a! @: _$ z- l0 U- a
    同样用例子来理解:
    . \, j* H5 I0 y1 u& K* t+ C& R+ C4 t( J# D# F2 a
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。$ C1 X' U( }: y! B9 v8 R

    ! C! w" o& d  H' X数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    ( B& L2 V2 o: a! [9 a1 L
    ) @9 M9 I& T* ~! y- E3 X! B6 Q最终事件的预测变量的线性组合就是:
    , k, @5 p8 O( P1 S' Q; y( V( q  `. v

    % O# c, {6 _9 H+ k+ Q; |odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    9 A3 N4 m6 y9 F% z& {( H: e7 v- A9 \6 y- ?  G
    ln(odds) = ln(p/(1-p))5 x% s: C! f0 D% \$ z, I/ b

    * V0 A+ C) l9 F! c9 z/ e2 ologit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk$ A0 v( r( I9 e5 r2 f
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    % h& U1 v1 o" _* f) h8 a) T* q  A: J, R; y- A7 s4 g: t8 k
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    ) b. C9 C0 S4 P1 I" w  d
    1 x- |& t! g+ Q, G% h
      `* `. f2 X: f
    4 Y" t1 s+ d8 t4 F from sklearn.linear_model import LogisticRegression
    1 V" a( W3 T; K7 K9 z' q
    & W+ O9 X' L& C, W model = LogisticRegression()
    . T6 J9 j! R; f, ^4 S+ r
    . E7 n% y- e8 \, @& f: _ # Train the model using the training sets and check score( v9 q0 u: q4 W
    model.fit(X, y)" O5 L- i2 i" n' ~7 s3 `
    model.score(X, y)
    : A( I/ ?( m5 s' \" F
    9 {- @8 Q" R& e6 u8 k# r! ^; N #Equation coefficient and Intercept
    8 H# N7 {& x! W5 B" H print('Coefficient: \n', model.coef_)
    ) T0 d# l+ X2 l1 T2 c print('Intercept: \n', model.intercept_)' f/ E4 J! B1 `6 y2 w1 U; ]

    . M& ]# k9 V7 V' D6 E4 q) H #Predict Output3 j9 @6 S# B  w( I8 n5 f
    predicted= model.predict(x_test)  T% A9 K& c! z- l) X
    逻辑回归的优化:
    ( T) R! L" I" A/ B/ q加入交互项0 r% B5 W$ E0 K5 }& i6 k, u
    1 o. s# {4 j* s" a" Y
      减少特征变量
    7 J1 m' p3 I( ]8 ?7 }8 G
    6 Q" X; ~& j8 S# X) q  正则化
    ) n  e+ y7 t# G1 N: W& w
    & Z) G6 I' V( L4 j  使用非线性模型
    & B, N0 x2 a: k5 y. X6 {
      d5 s7 V6 q, i3 |3.决策树( B/ B9 u) C8 r; j+ [$ g5 G- X
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ' h' t/ k9 Q. P* e) B% A+ s, i  B9 o" m5 [/ n' `8 L: E

    5 s) j* o8 t4 f
    / b% f7 Q3 Z( C0 `! `! h; @5 W从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。* b. c- @% J1 K- [) _6 w
    ! y- g: s& H( c2 m& S

    . C* P' A, C+ nfrom sklearn import tree
    $ _/ n+ N& M% W: f# v  C
    * C- S; V( @+ ?5 w0 c; g3 M
    ' V( p2 [$ m: F% y! C; w9 E7 n) y" u# Create tree object ( ~* |  ^! x4 x, c! g. M
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  ) ^6 e6 ^& j# h7 `# E
    : m) x  v3 Z: H& |7 M; C
    # model = tree.DecisionTreeRegressor() for regression
    % ^/ h8 |: q" @1 G4 H, I
    5 q( _8 `4 {9 r. H2 q# k/ H# Train the model using the training sets and check score
    1 _: s) S- u3 Umodel.fit(X, y)
    : k+ J* Y; r6 b2 o, Lmodel.score(X, y)! x4 H& h4 ^, ?3 E

    * c0 x* z3 b  [- ?, z#Predict Output, B" Z  u7 t1 ?5 f- H
    predicted= model.predict(x_test)
    5 w2 O$ h4 ?9 l' j2 {4. 支持向量机(SVM)
    + d* S5 r8 p6 Q! N1 e这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。1 v% R/ @# J- [2 A; a$ h

    8 u8 O" h4 u4 q' H- |, V' ?1 b现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    & T3 H+ D9 D! `  ~# ^- j( l$ B2 b

    ! r3 W& V* e. }( l" J
    # }! V- k* I6 C在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。) _* w8 L1 D0 a

    7 w; T& j! q! C  e3 [1 D6 ~9 h& P#Import Library" @& Y; f4 F2 I
    from sklearn import svm7 b, d. Y2 m+ L. P6 K9 h* j  {. C
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      E- e# I: s! I# Create SVM classification object
    4 G5 w0 ], P  y" h$ R& J0 `- G
    . n, a! r: [1 C% Jmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    9 `( J! ]. M8 x" h6 D
    2 e8 M& Z9 F, o; |$ j( H$ H# Train the model using the training sets and check score
      T7 Q& w) e- B! ?5 omodel.fit(X, y)1 V2 E2 C6 U" S
    model.score(X, y)
    + d$ {; f( G( l9 ]
    ) |' H$ G# q/ o: g" @#Predict Output
    % ]" {' |3 ^% t8 opredicted= model.predict(x_test)
    % }; {# k4 f4 ?. p' P: r' M5. 朴素贝叶斯
    9 U1 d& f# Z. ~  r这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。  X3 {+ _3 j- u7 K5 H6 S
    : }! J; d) f1 Q) V
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。% d) i; Y# q0 a' [8 S6 w$ _; I

    & `5 ?; h& B: ^5 s) ?$ A) }贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    6 U" X* ]: H; V' s  e. ]- B& U2 G6 T7 n: l
    4 O/ d* g3 R7 \' D3 p
    P(c|x)是已知特征x而分类为c的后验概率。. i; j7 O0 G8 d' p- _
    : q1 ~. X6 y- c2 T
    P(c)是种类c的先验概率。
    ) m' n; H) K7 [- K! D, U# O7 H2 C+ s- L+ H; i: ?7 l0 t
    P(x|c)是种类c具有特征x的可能性。
      F3 c' {  a, D" C* k( @* T' h" X; Q' e% x. A
    P(x)是特征x的先验概率。
    ; c+ w! c( p; |' t( i/ l
    ' ^- ?( K7 Y; R3 t3 {4 P% c: R5 A; M4 d1 l- G* M4 i
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:6 D# _  P" L1 d2 F

    6 M" s- w3 X& |5 J- x步骤1:根据已知数据做频率表
    / T( w5 S' M7 `! R1 J6 f# Y/ ^8 s1 F8 |& U6 U0 a
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.( F* K; B2 [. b
    # ]2 x& ^0 N" h! x4 ^: ^
    7 O+ @$ @; z4 U# F' `
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    6 i+ l3 i8 H$ E" e% @, y7 Z! `" A" v提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    3 X0 s5 O  y- U0 ^0 P, C
    1 z: K* K8 T, Q0 |我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    ) u: U4 X, L- a- i7 _: C! _
    0 q& y4 ?6 }# d/ P这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    4 ]8 o8 G% j0 M
    ' @4 Y/ V" G2 u5 d* e& X6 K: P那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。  G/ j' U7 x1 {: c1 g

    # f8 i7 v: i; V& U& g当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。0 T$ L" b" z2 ~' L

    ( x( P! _2 e. _! h; b/ k#Import Library/ r# c3 k8 r4 l" X8 s: t
    from sklearn.naive_bayes import GaussianNB' T; c* d8 Q% A. o0 U7 `" x3 M! I
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset, m" f' G) `  t' c- x3 _
    ! f7 @3 b2 J0 \; z
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    : c' j7 W: N0 _, K7 n2 E& k0 W" ], Y: ~  B4 h0 M( j
    # Train the model using the training sets and check score
    ! V" U8 }/ p  E& q0 o9 W9 b. w3 wmodel.fit(X, y)6 j3 e; p& Y( u  q" t
    % U" d# T+ h0 z, g3 D- `2 M
    #Predict Output0 |$ {, k; N9 X- T. ]3 b
    predicted= model.predict(x_test)
    7 d: R$ `/ Z' F6.KNN(K-邻近算法)
    , F2 E2 D- D7 d3 d7 ^# L4 l( F, K# a% t这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    ; `! P4 u$ r, V$ n" [+ w7 ~' P& [. V5 D: s  u
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    7 t! O3 v; g0 k4 k5 V
    8 G7 C5 X; B5 A" |7 j* W
    , p$ ]8 f7 p) }, S5 ~+ d. E! G) Q  D* r, _7 f& P# ?) `$ n
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。* C$ T3 {3 }. s8 m& V7 U
    # p0 I) j6 I0 J/ ^
    在用KNN前你需要考虑到:+ D: ^" G. e6 P+ G% T% Q  g9 [, E

    2 l; Q; H) t% q# A# NKNN的计算成本很高5 M( M$ A+ K) E4 e6 u

    1 s4 ^. _' g  @" W8 P: n所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。2 O- n* F( c1 Y" H" ~

    0 f# D6 G" V* g7 P在进行KNN前预处理数据,例如去除异常值,噪音等。
    - ?, l! d& ^" H* I  f+ _, P7 |# G3 l( Q' j6 D1 ?) K6 i
    #Import Library
    ' e1 B: ~7 _/ `1 V; t8 A6 Dfrom sklearn.neighbors import KNeighborsClassifier
    5 ^1 j+ m7 X& V% o3 Y) ]& {, U
    ' t) O2 G% B1 t0 _2 d#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 w. }( N5 e% P' ~. [7 M9 I
    # Create KNeighbors classifier object model
    : W2 l2 c: w3 ^# z7 Q& g1 g. L0 I) o
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    ! }* j, E5 s8 g7 _/ `$ y4 p8 K, k. R9 O/ R7 u; |& y
    # Train the model using the training sets and check score' u; g8 d: ~( i: F
    model.fit(X, y): p) j$ q6 @+ [. D5 Z" ?

    # a2 v" d8 f: @% r! i9 ^7 p2 H2 N#Predict Output) W, g5 y" P5 N- c; X
    predicted= model.predict(x_test)
    4 y7 a( P! [) D& l$ }7. K均值算法(K-Means)
    2 c# R* L) f# W# t  N" z( z5 s这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。* ]. y- a9 U* ^
    / b7 Y8 z. a6 r+ q4 n  ?" E
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!% _3 U* d; N) z9 o5 v0 U; }

    * d% s  @; G& n8 m* o
    : }0 d/ E" d( L  V9 aK均值算法如何划分集群:0 M- {/ ^' X- |

    2 [4 g; [, V" y2 c2 j2 h5 y% T9 ^0 m

    8 s- h' F- Y6 _0 X9 {4 v从每个集群中选取K个数据点作为质心(centroids)。
    ' D) O  H$ K4 Q6 K3 y' M& k, _9 n+ N
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。0 I& C* X3 O, X8 U  r# r
    : Q  B2 K% V0 i% a0 R" Q
    找出新集群的质心,这样就有了新的质心。2 H+ P" ^0 m1 @) H: }

    % F9 o0 Z  U7 [  Y, b' @重复2和3,直到结果收敛,即不再有新的质心出现。
    ! y; s; r9 Z; }; d- T
    5 Q% _9 h  K* S) C( J9 m
    + F2 Z% M6 G; L1 [怎样确定K的值:% N; ^1 l0 K7 L3 X( b4 [
    2 I( D) A( s1 w; g! K/ g) Z! U& `
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。5 P9 X( G0 _# p+ ?9 j% l" w" R& F

    & g7 m* p: z7 b7 b4 S. o( m我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    / b8 g0 y: {7 l4 x. r
    6 {7 V& Z, G! l+ X& u! A1 [4 h$ c9 O; o* u# C3 k
    #Import Library
    9 v/ ^+ D4 U) U8 a$ P+ K; Rfrom sklearn.cluster import KMeans( d% d# o9 |6 V) Q

    3 J0 W9 ~6 t$ F3 o0 A#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    # P( E3 X. n4 B3 A  @$ z% Z: K1 T8 v# Create KNeighbors classifier object model + v5 E; Q0 }) J! S$ [4 U* r
    k_means = KMeans(n_clusters=3, random_state=0)
    : }0 d, v6 u( }/ n& e  F
    3 J0 {0 t. X5 y( P* G0 O# Train the model using the training sets and check score
    0 r& K* k5 U, H& K3 Cmodel.fit(X)7 @1 X) F* y( W$ |/ f4 ]
    # r7 Z7 h; H7 a8 M" u
    #Predict Output' o- S! |+ d) d! ^3 D% R& O
    predicted= model.predict(x_test)
    * T6 \6 Q: I" P; v3 h) E8.随机森林
    . q! N% j5 z6 @0 `随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。  a+ a! I. B# b7 K- [
    ! c% p8 o. v/ g. u
    怎样生成决策树:7 @/ H. \1 r7 x

    4 {6 @% q# S/ E# g* k) }如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    + ~$ M7 Y7 F( J' t5 g3 M  l1 z" ~
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    2 s* _# `; R: u: M
    ) q5 H4 g# }5 q) h4 P每个决策树都最大程度上进行分割,没有剪枝。
      Z4 |, Z6 E* `( |7 A+ K' k& x& P
    #Import Library
    , D: {  A9 E# A$ ifrom sklearn.ensemble import RandomForestClassifier/ ~$ i, ~( [8 Q& p; x
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset5 ^! E  M  [' i$ e8 X) \

    + I4 N: N: l& v: d9 E+ s* v; |# Create Random Forest object
    " u, ?3 W1 m! j  f4 y, Y) @' rmodel= RandomForestClassifier()
    " m( ]2 a, N/ U$ N  V4 p8 P: ?4 Z6 ~  ^4 d: w
    # Train the model using the training sets and check score
    / V% L8 ?: j* n- L8 ?! E& I% Bmodel.fit(X, y)7 C* |8 ~( X* K  E' c( X7 f

    5 D2 F% T* H+ q9 P7 b2 e9 M#Predict Output
    6 r. m  n1 M0 ypredicted= model.predict(x_test)
    + G* M2 W$ Y- D9.降维算法(Dimensionality Reduction Algorithms): a9 H7 y( H' e
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。/ S5 y, g! N8 Q9 p: q
    . X6 n! K3 D1 f' t! B# s0 x7 l
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    # U0 O9 N5 r. Q2 U
    # V' p# |( p3 d* K  v作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。5 I2 O  Y' Q/ u- i5 S# J! n
    8 U8 ~5 y% e  F
    - U. `( m7 ^& x& F
    #Import Library1 y; A$ e+ x9 E) P
    from sklearn import decomposition0 K/ o: m9 m* I! d
    #Assumed you have training and test data set as train and test; B0 z# }$ {4 b
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    - u( Y: C% R9 g& `# For Factor analysis
    ' Q) H' i( o( V& g0 ~' i& |2 ^#fa= decomposition.FactorAnalysis()
    ; U  D& e( z3 t0 }# Reduced the dimension of training dataset using PCA/ z* R& {3 `1 V8 K3 Z
    & D' s) z0 q7 o- y( n- g
    train_reduced = pca.fit_transform(train); R( X- ?; B0 T  V7 ]6 W

    9 P' _) l4 m  x9 T" J6 @! h. \#Reduced the dimension of test dataset
    1 g1 n3 M* l5 N+ ~; x" D9 V8 g# stest_reduced = pca.transform(test)9 P5 i: N, Q5 v: `$ S5 Z
    10.Gradient Boosing 和 AdaBoost
      I4 p* w  O% v: O! |" W7 [GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。$ q. W" \3 J/ E; i) @
    9 U# @: x) y; c4 l
    #Import Library% X6 O( l" b3 m0 X1 }
    from sklearn.ensemble import GradientBoostingClassifier
    * t) q- T8 t6 m" x3 s. `9 c4 a#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    " g. H& b! `  C2 L5 G' `# Create Gradient Boosting Classifier object
    " B" E% I" Q9 @1 amodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)0 U; [+ y$ D* O: `& B2 [& `
    4 G5 [) {9 N: G" G: i
    # Train the model using the training sets and check score
    1 k9 A2 j' |; s: X' y. l' \8 x2 smodel.fit(X, y)0 b8 y# Q8 d5 W9 b2 c
    #Predict Output
    , ]. }( M. V7 t# b; ]- xpredicted= model.predict(x_test)
    ' y& K$ j, t- O4 D+ M* |5 o' HGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    4 @: U" Y1 W3 U" v8 N# a  ]% s, n1 R' z% [
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/511913862 D4 \4 W: a# {
    ————————————————$ a1 Y8 F$ [/ \
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( D) w1 @" _: s, i1 r5 I原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    3 ?/ i9 F  q! t) b8 j6 T7 c) b1 K3 F+ H
    7 d! {8 d3 U1 p. K! S* 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-4-21 07:48 , Processed in 1.234625 second(s), 51 queries .

    回顶部