QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2219|回复: 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
    ! X  E4 w/ {! ^/ u: c8 e4 B* j! m
    机器学习算法整理(内含代码)
    7 A- Z# U$ `% F/ m
    - l9 O7 J* p( `1 ^( N  O/ h一般来说,机器学习有三种算法:4 p0 M8 ^$ u' t7 N9 @5 F
    6 X7 K+ A2 f) f
    1.监督式学习0 T/ N  `$ I" x0 i
    ; e. h6 _% U3 N. o3 F
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率4 x# X/ G9 N$ k( }& A6 D$ I
    & y. l! u2 P' |1 Z7 ]9 G
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法3 `* X' j; b: s. H, W
    2 x+ x* X- A( h" R+ G6 p5 [3 \& E
    2.无监督式算法
    5 I; S$ n( z5 A/ x7 m: {9 q/ b# H( h/ j/ I9 t: ~
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    ; v. l$ t" H" t7 C! o; N* T; M3 L4 a! P
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    " Y# k9 F% x' S& S- [! l3 n# i$ r0 [% r5 \
    3.强化学习
    0 g0 f+ Y5 b3 W, Z. G# m( t3 ]
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定; H0 u+ w) s; P
    + e; Z% @& {" c$ O; J6 V; G
    属于强化学习的算法有:马尔可夫决策过程( m% d7 H9 O, s, U7 q2 y

    & c. n: T' w9 Y' o& ?常见的机器学习算法有:
    % {- Y- s5 g$ i6 w  W- }4 j: h3 i" P% [0 o1 ]# Z
    9 d4 ~5 N  `! W) P+ X  m/ N
    1.线性回归 (Linear Regression)
    2 c- G* H+ R/ a* _" S2 U6 {; n9 `9 Y, P8 R7 O5 @
    2.逻辑回归 (Logistic Regression)1 s' c, A/ C* d9 r( X- G& e7 j8 v
    5 {. p4 N+ `, P' ~4 g' m
    3.决策树 (Decision Tree)
    : G) W) H. p( ^& w0 s8 y
    * f* ]' j# g7 b1 w6 \4.支持向量机(SVM)
    6 Z7 }5 X+ w4 c, ]( d
    , J! l/ O6 M2 Q: ~& u5.朴素贝叶斯 (Naive Bayes)' [" C4 v- _" L* @6 E) C! i
    " @! w9 Q; C1 @3 z. ~7 Q
    6.K邻近算法(KNN)" h3 ]! z+ D2 ~+ N
    ; m1 A$ l- @: U) \6 T
    7.K-均值算法(K-means)% A2 |( N3 P# m

    2 F! T7 g5 Q# K" e) f+ C1 Y* j8.随机森林 (Random Forest)
    : c# [5 l; Z$ N: r1 n" U4 O' H1 v! Q. w+ t$ t5 W( G, g! s
    9.降低维度算法(Dimensionality Reduction Algorithms), \) p' P4 ]$ `# M/ f% w7 O
    + g. ^3 W0 k4 x2 s
    10.Gradient Boost和Adaboost算法$ k# }0 Q1 L  V. R) C3 N
    一个一个来说:
    6 b9 `- b( F7 q5 L; i/ \1.线性回归' i- b8 z( l- k+ f0 u

    9 x- |8 W& j1 G( Y0 e线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示." D4 J0 T8 Z' n: y- O

    5 M' e4 n/ d. X) g! I/ D" l) ]- V在这个Y=ax+b这个公式里:
    ' v% e7 U; S- G1 j# q$ l) ]+ A0 r/ B  [0 C
    Y=因变量0 t5 Q4 k% W9 H  G( D8 [% d5 H! G; h

      }! o" l7 Q8 G0 f( o% \ a =斜率- B+ O1 r3 b9 H: I
    1 y3 y8 H( `/ P
    x=自变量& e  ]  _$ p0 f. _( O

    ) O/ p2 h, x- E$ ~ b=截距; n7 V  T2 F7 H! o$ g( l

    . c! Q% X2 t4 f a和b可以通过最下化因变量误差的平方和得到(最小二乘法)! v' N& d8 w8 m9 \0 P
    . C* A4 C7 d" R6 L; I" Q
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。( ]4 q* R8 D4 Z, v; G" F
    : f/ O: Z- ~& H  F: m  O
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    , w; ^7 b4 p. H3 |6 Z  H2 |/ Q5 z: W5 a0 e1 L# a/ M
    , d& j; B+ w; T; o3 P5 _4 l

    & e) F* ^5 o4 t/ B7 Q% J线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.$ Y+ o7 o! l3 @/ Y* ^

    ( H, M' u" M1 i; ]/ k# Y  p& K拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    % j8 [. m4 |. M" D# F+ {" x
    8 C0 {8 K" N# e5 C7 `! m2 jImport Library4 L6 _' j4 j* `7 C3 l
    from sklearn import linear_model' s9 o+ l$ |+ H; Y& f, N( t

    , C2 o% @1 u: O3 f7 t$ wx_train=input_variables_values_training_datasets% r5 N/ I/ \, n
    y_train=target_variables_values_training_datasets
    : }1 J3 q: [) K, Y4 M- a) C4 Xx_test=input_variables_values_test_datasets. y. e7 ]6 t9 A
    5 M# Y2 A8 I& g# d6 K
    # Create linear regression object
    3 E7 Q( N( ~: E5 i9 k" }* H1 flinear = linear_model.LinearRegression()7 y) j" }* u# C2 i6 e

    & U, |9 l; I* p" M' o0 n5 L# Train the model using the training sets and check score
    , E) {  ]! s8 Y& J. O' Mlinear.fit(x_train, y_train)& H4 W* F& \8 Q, a+ Y; r3 }
    linear.score(x_train, y_train)- k1 |' f- j. h! }

    9 F8 U0 V& B7 S" U#Equation coefficient and Intercept
    * h# X! w/ ]7 Vprint('Coefficient: \n', linear.coef_)  |( i: s" r) K4 v( Y! @6 c# K5 F5 d
    print('Intercept: \n', linear.intercept_)
    $ j+ }( h* @% T. x* ^' U; y! C, L3 U6 }6 F/ T4 q
    #Predict Output
    & k2 X( A/ }2 V8 f$ Z8 o6 Mpredicted= linear.predict(x_test)  z2 w: D) ~0 A) K
    2.逻辑回归( c1 t9 A- R6 |" m- c" {  V' ^
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!1 G* ]2 W  B$ G3 E7 S
    # h: X! m% n% Z
    同样用例子来理解:( V1 s9 r' e- Z! A

    ( G: a/ x9 R0 o8 N; b' J假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    3 H( o9 R0 Z# h$ ?1 T- l8 G; M6 }* @% z1 u, M
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    / P$ t7 b0 v& G- e) R& E9 n6 g" R' P& j1 [- Y# J/ O
    最终事件的预测变量的线性组合就是:
    7 `/ H/ j2 t6 T2 T4 M( o8 }' l
    1 N0 w- ~) U: X" H- H: s7 B, `4 i3 d3 w3 t) z' ]
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence, {# {  ~) T) m, O3 A. p- t3 C8 R

    * P1 Z) g6 w+ oln(odds) = ln(p/(1-p))" V. y* Q) k; L) o/ I- j( p

    % |( [* r1 c1 r5 _% t& blogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk. P( [4 m! m/ n1 X8 o
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.- G# X( y4 q* F$ Z! r9 h) g2 F

    2 N+ k7 i5 F8 R# K, V  }* c至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.. _4 q6 @* K9 {- P- C) T
    + t9 Y7 Z: [5 G3 V# q0 K
    . g4 ^, ]8 f7 e$ S/ [. P$ \

    / `4 F2 P% P6 [4 B from sklearn.linear_model import LogisticRegression; B7 l. {$ I/ k0 ?5 ?  r2 [

    3 I  P( Y7 z# _: W4 L model = LogisticRegression()1 T+ I- [+ H3 k% y4 c
    . C1 t6 }0 k: ~; L: w+ K
    # Train the model using the training sets and check score
    5 K! m5 r. y6 I& l9 B$ y2 ?% } model.fit(X, y)
    2 K+ }8 b1 j' B& z model.score(X, y)
    7 J7 F: `( T" u/ d6 k8 d3 ^4 h% {: G4 E; {. \  v  S
    #Equation coefficient and Intercept& G1 z8 [) A+ s
    print('Coefficient: \n', model.coef_)% K0 q5 l  P5 n& S$ K' P9 g
    print('Intercept: \n', model.intercept_)
    2 N% w( i! N# x6 y  x$ A! v6 ~4 P- @4 d  }
    #Predict Output
    ' e8 I; D' q0 N# ~4 ~ predicted= model.predict(x_test)0 E0 C  ]$ e$ n- c
    逻辑回归的优化:6 I0 j; j6 Y% D2 r% z2 u
    加入交互项
    - t4 n/ e  R( @  u- T. _: p7 c/ ~  C8 l& x  E, W1 o0 W
      减少特征变量0 f! Z4 V, N3 B& V# A
    - K$ L+ h( j5 R5 {7 b
      正则化
    ( u3 w) M4 f8 ^  L
    ) z! q9 }1 ^7 n; ]7 r" y' X  使用非线性模型* q+ }9 u; u* p2 [4 o& v2 J2 M

    / T4 {! k. k, ]+ b. e3.决策树
    " H% X3 ?2 t8 N1 l4 ~2 G+ m这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ! S+ R9 {- u% Z! P! |& e; K6 b7 R' {

    9 z! R2 \- Y+ y4 |; s- D3 t
    7 ?/ i; s1 U2 n  b( |从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    1 k6 C( {9 v2 z7 o; l% F& o, E# G+ p* u; w! i3 m
    6 U9 w  X, O/ l: E# W
    from sklearn import tree
    , W8 d' K! ^4 k' g2 |! D3 @; `/ h! {, A( W% F& X5 D
    ( i, G8 W' v3 M1 R- F
    # Create tree object 5 M3 g/ Y5 Q  |, y6 \$ e# L" j8 J+ E/ G
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  # H, R4 R  o: O" r
    ) M) l+ J1 Z7 N5 Q
    # model = tree.DecisionTreeRegressor() for regression
    1 H: n3 D/ @/ V4 D1 B8 }2 L
    ' o& y7 r$ Z0 r3 K# Train the model using the training sets and check score% Z8 W6 e% S9 _: b) J9 t7 }
    model.fit(X, y)
    4 q) f& ^: u. `0 `" T7 c6 w+ fmodel.score(X, y)+ \$ E7 U; d* P: G( W* e5 A

    - ^/ N1 M' x1 z$ ]0 Y% n#Predict Output
    6 B7 R3 J0 K1 p& S: D; lpredicted= model.predict(x_test)
    2 v6 E5 x6 h! b4. 支持向量机(SVM)8 A, H) e) O2 Y
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    5 ?' X2 w# r  j& [/ q# u" y' _
    4 @! m2 s4 B9 T, x' `; P现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。: C# C# B" R# j
    3 ~+ F; U( v2 S3 ~4 e# [  P" h. k

    ) @. n1 L# C3 u3 v
    # V# n+ y" N: X  w在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。# j, I; I/ g3 A4 }1 B2 w! `

    8 O# X/ M9 M" ?. G8 h1 P- A+ P#Import Library
    & Q9 V3 A% E8 }1 dfrom sklearn import svm0 \: ^5 \* Q2 N. k# O
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    % V+ |) C4 N. F! e9 ?# Create SVM classification object
    % A4 z: B8 d. [% H- D
    : }3 |- u" `: ^3 s7 r9 ^model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.$ t- [0 L$ \* {2 f
    4 E" }" Z- i/ t5 l7 i! Z
    # Train the model using the training sets and check score
    % |& @* ?7 X9 @- @  {model.fit(X, y)
    9 @. A* C5 K) l( ^$ E3 S5 C1 \model.score(X, y). O7 s3 c. q( E* E  \0 H# I) I. R
    1 L9 m4 i8 }' V+ m5 K
    #Predict Output/ r4 c; S+ i+ a* V+ _# B
    predicted= model.predict(x_test)
    - c! |; a7 i" V- j5. 朴素贝叶斯
    ; K  ?/ f3 ^" V这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。5 C. D* `* }, E. f" V/ J
    # j, t# ]: V) R
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    7 d6 q: t" }  _
    , {) \: h2 d. \贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:# ?0 k0 v: s5 o( m0 i$ M; C

    & d8 y9 Q+ j. f# h
    : X. j, q  ^$ z/ d% W: `P(c|x)是已知特征x而分类为c的后验概率。
    / x; w  m! T! U/ t
    * w0 K) ^' Q- |" V1 KP(c)是种类c的先验概率。
    - ^9 d2 b# M% i6 U; z: V. ?  h0 K/ _; @! R8 w
    P(x|c)是种类c具有特征x的可能性。
    % o; Q! D$ @0 @: v* J3 M5 x& B4 b. j( C# K8 }: z
    P(x)是特征x的先验概率。
    * x8 [  @" t& a
    5 N  I+ k+ q- Z& a, j6 ?4 Z4 O' y$ l; u+ {, ^
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:' g* u! m  ~$ G5 S. u
    # E3 B2 O3 z# D8 P
    步骤1:根据已知数据做频率表& a& M& p* j, P( l; t9 m0 s

    ; X3 y2 c, o* j步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    # L  S1 }* |* k/ Q- [
    7 p1 O) ~( {& V) c* j8 I
    4 x( f8 i0 S+ i' C步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    ) i( w0 p/ r0 q( R. ~7 j$ S提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
      B9 {5 ^9 a0 t7 B. B4 V4 a  b4 h, x9 c2 k: `- U+ ~
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    2 D; n( ^5 b' P, b2 q& V! q5 ~7 O% r1 h- N! c: E
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    ! v7 k/ y2 f9 \7 {+ C3 Q' t
    ) p1 P) o4 I) M那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    ; |1 c# g. [" `1 y5 Z8 M( H  f0 o
    ' p% |9 f" h+ {* P( y当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    # l7 U8 v" ~5 D) X# R% H' v; _( e! i& m9 n. N1 |0 O- Z! J4 @1 u+ g6 k+ o
    #Import Library) |# r5 F( o! C6 b' p- V
    from sklearn.naive_bayes import GaussianNB
    2 ^7 u% {( j' e/ }* P4 r#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      f* @8 J- ?/ i/ c/ d9 z8 o: b) h& s, E( `& ?
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link( I0 @; f/ H% S3 ^+ \. v& z
    / Q7 y/ K' B% x, X
    # Train the model using the training sets and check score; b9 J$ I) `1 N1 A  c
    model.fit(X, y)( Q, W7 h! r+ V  M8 y  B' p

    2 p/ z7 t5 X. p) |#Predict Output
    9 T0 f$ F* l+ V6 q; ]& kpredicted= model.predict(x_test)
    4 N' r: V. p* Q! U6.KNN(K-邻近算法)
    . W: a# L+ i3 D4 D, Q) Y这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。4 o8 c$ @% d/ j3 a$ W
      Z( {0 P# {. k0 V4 }6 M' A
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    ! a0 e- p) e4 ^) }! `; P" t9 M
    4 V" b# H2 }4 A% i6 H& G, {" f% v9 M2 N. h7 j8 ?2 ^

    # D- J3 |: \3 |2 e# D" m0 fKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。/ g% B4 w  i- b# o

    # H3 N# O2 [, W" j/ y+ G' P在用KNN前你需要考虑到:0 z8 E7 |3 g4 ^% z0 p
    9 z: U% s. E2 y/ {/ T
    KNN的计算成本很高
    * z8 w0 a6 J1 k8 z$ z$ {8 q1 g: Y. P( b+ ?6 }% v
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。. v7 g5 n" ~8 F8 `8 D$ ]! F

    8 A- N5 I" c/ N1 m% L  M在进行KNN前预处理数据,例如去除异常值,噪音等。
    2 H: ^& ]3 {! S  ~- `3 i
    4 ~, u; i. r$ E5 ?4 w#Import Library
    , H1 `, t( X+ H& O5 Ifrom sklearn.neighbors import KNeighborsClassifier
    + |9 H6 E2 S+ V' O; C! U% G$ H. a
    ! ?2 C8 W; ^. A" Z#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    9 M$ a0 X6 }* j6 i" l2 L. Y# Create KNeighbors classifier object model
    & L! O+ Q* J# s2 l% K
    1 U' W" M+ }( y# ?1 F+ gKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    + x' \# w# q/ \+ B6 Z1 ]/ i1 D+ d6 {% r* C& Y" @3 R. c4 M" N! M
    # Train the model using the training sets and check score" |6 H+ ]0 y: b+ x
    model.fit(X, y)
    / a8 |& W" L# Q1 `  E7 K/ M0 `! O8 {- g% C
    #Predict Output9 A4 e6 g( U, ^( N& h; A# G
    predicted= model.predict(x_test)
    4 [( w2 I/ `3 |; I8 ]. N% z7. K均值算法(K-Means)4 e0 P6 [8 P2 P3 B
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。3 E, e+ y  Q# m# P4 G

    5 D* r. J# ?8 Z7 ~还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!' t" i# B  v( F5 `  K# g6 G0 a

    ( R+ V$ c3 b! m# f8 ]/ I
      J! ^4 X9 l$ a, j# z( @! TK均值算法如何划分集群:. K; T" ]% F/ r3 @- U7 B# w
    " ^$ x  B! c6 J/ L5 y, ?
    1 \; u2 r8 R' c. Q, G( j4 g

      _+ @9 ^1 @: J8 ]" J从每个集群中选取K个数据点作为质心(centroids)。5 E6 g" A4 S8 k% H% w# q1 F2 q
    ' e) @+ l9 X( \. l5 u% G0 _( d. P
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。+ r% ]! q! n1 j8 S
    7 G7 |3 d9 A; o% A7 L7 Z
    找出新集群的质心,这样就有了新的质心。6 c- M" q9 p. n7 K3 I
    : h7 i3 F' R, i( \
    重复2和3,直到结果收敛,即不再有新的质心出现。
    7 C& j- c+ E" J
    $ N2 i- s) i- W* }, Z
    : x/ Z% x# o* J5 F8 A5 p$ y( b怎样确定K的值:3 W9 F& o0 S5 t) {2 N5 v

    " \- m* s  m! o/ z* i7 z如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。! A, g/ _! ~1 M0 j, F! v: j
    7 h/ g2 c) \/ r, e6 N2 V
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    1 D( x- F1 f- i7 H$ T. W6 [% B3 w4 u% H: S9 [$ [1 n+ E$ h( D

      }' L9 \7 K9 R8 ?5 {/ z#Import Library
    / D( h% g5 Z: dfrom sklearn.cluster import KMeans
    , Y* r3 x9 }1 t4 m4 [6 @* L( N. T
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    - M+ }9 v0 T6 J! t8 g# Create KNeighbors classifier object model
    ; r7 L+ @' w$ x/ J" sk_means = KMeans(n_clusters=3, random_state=0)3 \# s# y2 r2 a  f
    ! @! ^- ~' t- e7 X$ p% J& L# y
    # Train the model using the training sets and check score
    ( z% j2 G, f8 }9 e, `/ H: L1 Pmodel.fit(X)6 a: f! N7 N5 r4 F" m

    2 I, x2 u/ f; c7 A* ^& ^3 v* x/ O8 s#Predict Output
    $ w( F2 Z* ^' ^# ~- x0 |predicted= model.predict(x_test)
    & G9 m% e# R) @8.随机森林
    / w& F% P8 f0 X7 z; ~" F: u随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。: o' k  W" k5 ^# E2 A3 L" {! R5 v6 H

    " T0 j% k4 y- t5 |怎样生成决策树:8 {* D, n$ F# T) U3 r5 \: [

    ( t/ j0 Z" x! ~, B: M( R$ ^$ O如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    : s+ ~7 ]5 l* P2 j$ k! O1 V1 J6 R2 o6 C8 o- m% ~
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。" V. \: X" s' N. U( @8 _
    ( Q# n; o% v+ r2 Z  r
    每个决策树都最大程度上进行分割,没有剪枝。
    2 H$ i) v% w3 y! p7 d- V. I- B4 u+ M  Y$ d2 @
    #Import Library( p& |7 l3 i, i
    from sklearn.ensemble import RandomForestClassifier! G) Z' M7 E2 F, ?6 x
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    0 G$ Y5 X, g+ _7 j& r; ^; F0 Z# G# C- d6 y9 E0 T9 K# U
    # Create Random Forest object
    8 z$ C# P. o# W( H4 ^8 c3 Imodel= RandomForestClassifier(), U# u% A9 A/ _; l) w# b) ]

    6 L  v' M) M7 }! [! i# Train the model using the training sets and check score/ l% W6 B; ]8 Q9 o2 ?$ L& C( a2 `
    model.fit(X, y)1 T3 w2 ?4 W8 V8 M/ N/ o. ~7 a
    9 T6 S# _% m: p0 N5 F# H- e
    #Predict Output- W$ U' d' Y1 w; K: ~
    predicted= model.predict(x_test)
    9 V! L0 s) U4 w* Q1 Z  h& U9.降维算法(Dimensionality Reduction Algorithms)
    ; {& Z$ [% n; u/ U3 j/ z! u: o在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。! ^% x" Y) A0 ^% |* z$ g/ @6 }
    1 u8 ^" ~4 ]1 \# p3 `( N
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。% A# ?. w4 k0 s0 [9 a

    ; s3 H$ R5 ?( a9 ^9 U作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。8 f+ [: b# J) d, H6 S7 n/ `

    2 N4 P) S7 G5 M/ t+ U3 u+ X
    2 c$ L: l) m, B. c#Import Library3 y1 F; k3 _# Q2 }' G
    from sklearn import decomposition
    1 m9 d+ \0 a! N  |4 d; s& L5 D) q#Assumed you have training and test data set as train and test8 k4 r+ `% Z' p7 b% `
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)1 l6 M* q# W& m' O, C- V
    # For Factor analysis1 z1 h9 h5 Z& _" @- t9 B8 t! R
    #fa= decomposition.FactorAnalysis()  e; a, v: D, n. \5 L* R$ U
    # Reduced the dimension of training dataset using PCA
    ) Z! E1 W) n- ~0 h  R6 U2 ]
      {1 o% |% ~, F  ?/ X: I$ M* Ltrain_reduced = pca.fit_transform(train)
    $ J; ?0 o! H( |- G# `' @4 s2 _* K$ k5 s* p& \
    #Reduced the dimension of test dataset  s0 R2 \1 m3 `  y6 b
    test_reduced = pca.transform(test)
    ; z3 g) N9 m, ^- Y% q/ }10.Gradient Boosing 和 AdaBoost+ A( @- r7 [, {
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    . ~7 B1 s4 ]2 w! g$ T$ p" H' O" l7 K" a
    #Import Library
    6 ]" m9 P$ y4 ~  N: sfrom sklearn.ensemble import GradientBoostingClassifier9 Z- u" x+ r! g$ b; Y
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    $ j$ k/ ?$ @* I- Z0 d5 Q# Create Gradient Boosting Classifier object; ~2 ]; [$ I* l9 f) J; g
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    * ^, G* M2 F4 l0 j
    6 h& V* J! M& Q0 w& o2 M$ T# Y# Train the model using the training sets and check score1 r  W9 S2 r/ l% J2 B( R4 ]( B4 D4 S
    model.fit(X, y)# h/ v2 W1 ^' P
    #Predict Output
    3 W, ?2 a6 F5 r- L6 P# ppredicted= model.predict(x_test)& }$ d/ i6 f5 K% ?7 G
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。" x' w! H9 z# h( z+ Q8 S4 V0 i/ W
    ) L5 w1 g( w8 D
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386& P& D6 }( |$ \
    ————————————————- N, g" w, ~! L- @8 z  |4 q3 R
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% {! Y% K1 _! I6 j: C- p; e. ?
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    7 g& ?' p- t, L! Z5 T
    2 z. @- I+ P8 \) E/ _. p# `
    % b  p9 L- u- `9 D7 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-15 17:18 , Processed in 0.395669 second(s), 50 queries .

    回顶部