QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2229|回复: 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
    / z9 y4 o2 }1 t& h5 H+ e
    机器学习算法整理(内含代码)
    ' i( y) }$ P- ]1 U! `
    & L9 `% G  Z- j7 H9 J一般来说,机器学习有三种算法:1 `3 K6 ^; i0 P0 u$ r) C

    + p/ d& c) h( o/ x! D* W- z( Q1.监督式学习
    & y0 x' ]3 y# R3 L- o, j1 V; g2 y) ^# L' z4 |
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    2 l  D" [+ C$ o- K
    ' d. m' @8 D2 p2 n2 l属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    6 j# i# D4 o9 U" _8 W  ^  C* y$ M* S2 B* I& c" g. o# W+ H
    2.无监督式算法# D3 R+ n; c; C+ F& n; o/ n

    0 c7 s6 B3 T: O3 A$ E无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.0 U9 Q) S2 _" E. |, i6 T
    : e8 A/ A* @) W& b8 d- M$ M
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    8 e( |2 ^2 Y% ~" l4 x; y3 R! R( \/ t0 c
    3.强化学习( B* O% p9 Z. ]

    : m  k3 R) S. d% o9 R这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    3 S7 C- p* G" `# ~) [2 R- `4 O7 U1 A7 W; M: {3 b
    属于强化学习的算法有:马尔可夫决策过程
    * d* Z4 C( \+ ?, j3 u/ g7 N" d: A0 E, T: `7 a- Y9 K
    常见的机器学习算法有:8 x; [/ U$ h2 }5 w/ c4 M" I3 I% H% u
    , r8 U6 v, ~) J% F

    % d7 e2 }4 A& P* Q1.线性回归 (Linear Regression)2 k. D# X0 l- i

    6 @7 l2 J+ x8 ~  d2.逻辑回归 (Logistic Regression)0 t4 w: W1 H6 R6 b/ r

    ; s0 l# Q  D1 R, C! K7 [3.决策树 (Decision Tree)
    ) ~9 Y+ Y( K0 ?4 U5 q, O, D5 x7 c; e5 I2 [4 G* x6 C( w+ w# R
    4.支持向量机(SVM)
    2 F8 P; s" [8 E8 c
    5 I9 [" v) X, O) S9 j, f5.朴素贝叶斯 (Naive Bayes)
    ' M/ a) ^5 x7 V& L5 W9 {. x% U/ o
    6.K邻近算法(KNN)
    5 S* W; u; P( @- \% b* `% M* b/ y# `/ s" [7 V: p; ^/ A
    7.K-均值算法(K-means)5 ~& x! l6 {6 h, Q' t+ B

    5 [3 b2 R$ r1 o3 {1 \' [8.随机森林 (Random Forest)
    4 |8 ~9 @7 f1 O$ C
    0 ^% f( u* {0 M  `9.降低维度算法(Dimensionality Reduction Algorithms)
    5 `$ h6 S) c, I+ @* q( k" ^& G& I# l" ?
    10.Gradient Boost和Adaboost算法$ Z# V/ g& j# h
    一个一个来说:
      U: p6 U3 Y$ R9 j. I+ ]1.线性回归
    / j) N1 W9 o: n
    9 ~8 p6 i$ r( t5 s" y线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    + C3 I0 V. z+ T6 x2 a+ q
    * }* r3 W  H$ D在这个Y=ax+b这个公式里:
    # u. m% b7 K. P5 W# X& L, C% y: s; u, F
    Y=因变量* o8 e2 O! z0 ]+ \, I9 ~1 e

    ) s& K. X5 {4 C a =斜率8 E* H- O9 \7 J$ \
    5 L6 L  g/ X. t# ^: m
    x=自变量
    $ y2 _0 x8 f# _6 O  g+ f3 [8 y: N$ h, w
    b=截距
    0 Z. N! |& t3 ]: B7 s( ?8 d4 I: a  B& m0 K' {& M& K6 D) o' _+ c' M
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)" ^  R: {2 ]/ d4 Y8 L  O. j7 ^

    : P4 M; H' A" z+ `; B8 y我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。2 @3 U6 ]! M4 f/ q; u( i& u9 d
    ! @4 ~' d. K8 l( B& \( m
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.5 ~. G; |; t# R5 L, }4 S# C

      k2 K' P* e3 a; I( z) Y5 e, C/ p" ]8 s, ~) U& S$ y2 D0 }

    4 i- O5 d& v. [3 y' p线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    0 E! M4 ^4 }# Q+ n  O% S0 _
    3 }  I  W2 H* k4 e/ h拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    $ H/ N5 M( ~" z% Q- n8 u/ B2 I* C$ @  `
    Import Library3 ^0 L( j  w8 E
    from sklearn import linear_model
    8 \& \2 a4 J2 J: v& a) P* A! _, _
    2 Z; t; s% S( e4 {x_train=input_variables_values_training_datasets
    $ Q- @3 h3 V. X; G1 Hy_train=target_variables_values_training_datasets
    / \2 S' o2 |( z0 R# j  nx_test=input_variables_values_test_datasets) g# n6 E, z$ `+ [* ^4 `

    ( u6 {; g# ~& B2 T: r0 q  u# Create linear regression object4 ]: W8 x7 w- n( F/ V, a
    linear = linear_model.LinearRegression()
    9 }/ O) t+ P; l% F* }9 ]7 \! b7 @% d6 m% O: \+ ]: o
    # Train the model using the training sets and check score' c1 K& T! n1 _& X0 d
    linear.fit(x_train, y_train)# j; F7 s* j+ h# T: y! e* y
    linear.score(x_train, y_train)
    * }# y) M6 Y0 ~9 V7 N# @, \6 }) V7 y6 }
    #Equation coefficient and Intercept: a: h  l% ~! j% s' P  {
    print('Coefficient: \n', linear.coef_)
    + z  }4 o' q5 R+ oprint('Intercept: \n', linear.intercept_)+ N" v7 i  E; b7 L) q
    * m- t6 K* |0 l! P) ]& u. I
    #Predict Output( O" I0 o: {" r: M$ {% y% M
    predicted= linear.predict(x_test)3 x: Z+ S" |( m& q2 M* V2 l* S8 O
    2.逻辑回归0 z' K8 W  C1 v3 P
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!# z3 G: G  O" e$ s- T+ e. Z

    5 s) P1 l/ ^' n1 t同样用例子来理解:/ z- t3 o3 g. g" R: ~" N# V# D

    ; g& l+ D+ L: i  H8 @' R' a假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    * z! r, T) ]- o! |4 b
    ) u7 ?( @" Y! F4 y, R+ `6 I数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    2 h- p1 P4 r/ b" ]( {* [! b, ~2 j" F
    最终事件的预测变量的线性组合就是:% M* q: Y4 w  p% a8 C
    $ M2 P  v6 D: D( m3 X3 l/ l8 i

    ( t) O: o- \6 |/ `; `$ todds= p/ (1-p) = probability of event occurrence / probability of not event occurrence/ ?' [7 ^$ N+ c& Q6 U

    ; p, K" e/ L. S" Qln(odds) = ln(p/(1-p))
    + p) k3 V4 N% y2 g* ?! H
    ; g% Y" }" s* u# ulogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    . m, \* y4 x: X7 {8 L$ ^' W2 A: U: \1 k在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    0 B, {# P  K8 S# I* e3 F9 Q% x
    + ]( p1 @: T" B. `7 N7 P( N% C至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.  u1 d. n2 `3 z! y+ \3 l" C: W

    9 J( s9 W/ Z7 W, v4 F& [. k- z# l, D4 N

    1 h7 k1 j+ {, B/ {4 {  [1 S' ~ from sklearn.linear_model import LogisticRegression5 \7 C; r  r' D$ s; v% Q+ |
    2 _& d; f. ~5 t2 d9 ?' H
    model = LogisticRegression()
    2 E6 d/ g. p( C4 J" W! N) g! |' j8 {- W) T6 }) X' F/ z# M
    # Train the model using the training sets and check score: G2 Y, }* r5 N  W/ [/ W
    model.fit(X, y)4 L0 T* y6 E5 X- t& l; T6 |4 L: d
    model.score(X, y)
    0 S: C' T9 X  [# i; j" x; v$ u* j. T7 f0 B- r
    #Equation coefficient and Intercept7 P; L( M  r7 d3 T
    print('Coefficient: \n', model.coef_)4 m2 x, t6 P4 {$ }. ~6 T
    print('Intercept: \n', model.intercept_)! y$ }+ |! l. {
    0 m9 N4 l. ?6 I* g
    #Predict Output
    1 h* F7 L4 }* Z! R predicted= model.predict(x_test)
    1 w0 ~1 m$ i, B: \$ J9 i逻辑回归的优化:' c# Z; k# K, A  s
    加入交互项$ O: T, C0 U2 {5 X
    : [! e8 h; f/ y" s3 G4 ?
      减少特征变量: I; [7 s1 J  d4 z  R1 N
    - v8 H5 e: H4 a: [
      正则化
    , m4 d2 y( Z3 T, p$ o0 ^9 E, G9 ~6 K3 n& [
      使用非线性模型
    " T# a1 n3 {+ N2 ?1 _! h5 L9 V0 q  h9 j* c3 a2 n; s; d
    3.决策树
    * W/ O( ^! P( R0 h0 y2 a$ o这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
      C0 G' b4 o" j/ j, d% y- ^- I& X. R# k$ B; W9 v, P* l
    $ ~, i- l% `5 c; }$ O% R

    ) y. O6 F7 W+ i% N2 N2 S# c3 [从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
      l! s( j  Y5 p' w" R2 u& A+ d' B
    . b( d1 X9 H8 E, e$ z: X6 t8 f: ~" t/ B
    from sklearn import tree) A# K4 P5 H2 `$ v& x3 d
    ; V/ M: }% B& `% m) M2 t6 e
    1 [& \+ \6 h9 r' u  e
    # Create tree object ( |6 d5 n7 g1 b# f2 P
    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 \% v5 D2 t  U2 `8 h3 `
    ; ^( e: T8 r  K: _$ u
    # model = tree.DecisionTreeRegressor() for regression
    * L  l& B3 i: j
    & R( f3 r: n) l3 w+ f# j3 f# Train the model using the training sets and check score% y+ T# i* J5 p: n% x
    model.fit(X, y)
    + I# z& _* ]6 i* j' ?% gmodel.score(X, y)' w) ?. _' U4 t

    * h6 J  [. |2 ~# z9 _5 V2 \* v#Predict Output
    : c" y/ ]; }) w( Q# @predicted= model.predict(x_test); C( c+ Q+ R4 [6 p, r) @
    4. 支持向量机(SVM)
    6 I& D- n2 O$ s9 a" n: m" \' \这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    0 k: x  v$ Q; A( X" G+ y" M( T" v* p# q0 \& C  ^2 ]
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    ; r  U, o# e* q  K+ a. k  T+ O( r6 y0 M% _* m  G

    # w0 z; f9 R4 C0 J5 S8 p; m$ ^' Y/ w; l6 O  @/ @  J* o
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。6 _3 M' A8 H+ r. \7 H
    % K; p9 l3 C9 J" E* C- z. J3 Y
    #Import Library
    6 z+ k( Y6 W3 w2 d. B6 _from sklearn import svm. k, S9 T1 X) r. D3 g
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    2 B+ M  h$ M' G' p# ~# Y# Create SVM classification object
    # n% c. e/ q1 A4 u- x8 D$ }/ [' q3 k, ~  {! f
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    6 s! @, U) x+ f8 M) T* C
    9 c1 U7 @) E8 l2 D5 m3 `# Train the model using the training sets and check score
    / ^0 o- N9 [# K$ W( M9 E2 \$ {model.fit(X, y)
    " p+ V. q8 j3 X9 w7 bmodel.score(X, y)7 T' G! D. |4 R) `1 C5 U

    " O$ R6 _6 z2 p: a' n+ X  f#Predict Output
    ( n( ~( K" c. V5 F( Wpredicted= model.predict(x_test)4 F! f. k6 A" X1 J& `# B, g. g0 Q
    5. 朴素贝叶斯
    / J1 m/ }, h/ X% B. x! `这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    2 ]' o9 D8 a6 G' l4 G9 o1 t( q9 U0 G
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。7 M0 |4 |# x( K( N6 l; x/ e

    9 p$ t6 Y& q* \2 b' i1 W2 `贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:9 p9 k3 \1 i( s

    6 i1 `5 _9 k) g; j! f8 N5 _# A3 I* i/ v, L& j8 d% U. C
    P(c|x)是已知特征x而分类为c的后验概率。5 s/ \% P5 M8 [7 ]- z

    # a# o! C( U. s5 n0 WP(c)是种类c的先验概率。- ~* ^/ Z3 U2 A' W  h
    0 U3 P: |# F( y; P0 l! r
    P(x|c)是种类c具有特征x的可能性。! l- B4 u8 I- Z% m
    / b% A0 ?& W4 v. f  J3 X/ f
    P(x)是特征x的先验概率。
    % O. H# ]0 @; X  I* ]2 g8 X$ u9 ^4 ~; E5 I5 _

    " Z% N# P5 P- {& z* U例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    . g# Q3 f6 x, _# |2 p/ u( ?/ V% g1 Q; J$ j' ^" Z$ X" g8 D
    步骤1:根据已知数据做频率表
    + W. @+ n9 b( G* \8 {% q/ x' e( Q8 M) f% f* I9 @3 `
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64./ T, @1 _4 |6 _9 p9 @7 x! P; r+ Y- B
    9 D6 F0 D% d% B4 Z2 H3 M: F6 {: V+ ]
    ) f% `' W7 K; j
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    # O: G1 B  W% X8 i. {5 _提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    ; d6 g/ d4 s! C+ ^! a
    $ ]# d8 {% |; J4 b  {6 o* t7 m我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。) X0 c2 P% i3 ]7 A, g! X5 `
    1 W  R. U) ?. L* z
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    ' X, ]0 n9 ^- P' f  g" ~1 }2 V% ~2 c
    " C6 }# G& ^  m4 E5 Z那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。* m6 u' z& D$ _  n! B

    $ m# L% c1 B) h& {) \当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。# Q7 e1 ?  Y" `  {

    % o5 P) F$ |  s- A#Import Library
    & A, _+ \& Y" |* J7 e8 R+ P- Ofrom sklearn.naive_bayes import GaussianNB
    ' o! g( i( a. J9 G- C$ R#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset  Q. u4 x7 W8 R4 K" E) X( Q1 D
    4 j0 n8 x9 \8 y6 q, x
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    ) Z5 S2 ]. l# F3 U
    . O% X- G2 W, Z$ ~1 e8 k  Y# l# Train the model using the training sets and check score
    ( `  n$ E) {$ A2 B0 g6 [model.fit(X, y)$ f, C' E- W( e7 A8 Y
    # E' H. |8 j# c+ m% p9 Z
    #Predict Output, @6 y$ Y! e4 C' B, e2 i' k- _5 a
    predicted= model.predict(x_test)9 ~9 Q9 W4 I- V. T5 ]
    6.KNN(K-邻近算法)
    ! l- F2 m% K4 V- D% A/ U, u) }这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。) \/ S2 S1 V5 a
    ; p, x6 E- V5 {7 V
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    6 o: ^" V. \, {3 u* I
    6 A1 M0 c; f4 h! y- W
    + X  A* G8 w" w( S
    3 v) R- I; i/ iKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    ' d- P7 }$ r) C1 x# y' c* x. W, e# i6 u
    在用KNN前你需要考虑到:
    1 C: d8 G  Z) v
    ! r5 U5 v8 M; v( T4 w/ \* k1 h! n; vKNN的计算成本很高
    / {) Z. _0 A/ x0 ^! W* S
    - D% C) i- H; O4 z& u- B7 e所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    + Z- R8 `+ Q+ }( q& b8 F5 u6 u( ]3 g8 v
    在进行KNN前预处理数据,例如去除异常值,噪音等。. Q3 h3 C. |) Y- \, \

    4 A# B8 [2 ^; Z% {8 l: n+ ?#Import Library9 y+ A5 z- \/ s4 L1 m
    from sklearn.neighbors import KNeighborsClassifier
    + j, P8 ~5 J+ ~+ e: h
    5 ?" A; h, B; j! G#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset7 u3 v; c' i8 ^
    # Create KNeighbors classifier object model " m- u9 B, \/ s' h& I+ Y# C
    ! P( L. x9 y' B+ p  M6 |3 b
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5+ t# e9 k$ x, Z3 q* W. c3 r4 B
    9 J/ {2 g4 F$ s4 c. H
    # Train the model using the training sets and check score
    . ~) p. o2 X$ J3 }model.fit(X, y)0 F2 M+ I/ ]$ S; g

    2 \! V# [# M, S4 J#Predict Output
    $ \! T+ [) ]2 {predicted= model.predict(x_test)6 m5 Y5 X: K& ?8 \  y! ~& o/ F
    7. K均值算法(K-Means)
    . W$ |! F+ h! c' ?* y这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    3 K5 L9 W! e$ L3 Z& _, M" s# a% ]& h! {* u+ u: U9 [, z
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!# I2 \1 Q7 @$ W5 t# X+ D3 m/ ]1 x

    9 C6 m  r) I* n& i1 Q: @) ?, [* I
    9 w6 Q' J& p9 B/ S$ s4 qK均值算法如何划分集群:$ e( O2 G+ i* ^

    4 C/ x% s( h7 g/ F/ z# u2 W2 z
    " F8 \8 J7 o0 \( E. J9 ]1 T8 G* c$ W. G8 |' d  u% j4 {
    从每个集群中选取K个数据点作为质心(centroids)。* V7 P; H& p- Y$ d  e* x5 o

    7 Y/ ?, Z7 z, @将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    # z8 i/ K8 u# A/ {7 l  J6 c+ f4 R8 T  K" c
    找出新集群的质心,这样就有了新的质心。: B5 O3 k7 y+ }( [' b
    6 d- S: J( A8 p
    重复2和3,直到结果收敛,即不再有新的质心出现。( p" T, T% f/ R3 w  a
    / G. x9 h3 v0 o- H$ T

    ; Z$ {! q2 K% R  w( k$ V怎样确定K的值:2 K( U& G5 ^& T$ m1 X. f) S% p
    1 k( w$ k( D( |# D- }
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。% }$ N3 S7 y5 T% x  `! L

    * _& H" o4 v( T我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。, T' r4 g9 k* j. Y$ \

      r0 e. W" L* S2 U7 _  t
    # N+ _! E" l, l7 C) E# D7 k1 \- K' V3 ~#Import Library
    0 b+ r; H# v! M4 L4 nfrom sklearn.cluster import KMeans& W" }# p; J' m& @8 |. y

    0 a6 I, V3 \# h) c* c#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    8 W0 o9 l& Z( _2 r- K; F* x# Create KNeighbors classifier object model
    ! A! `5 k) }4 V! q( Q" p! ~k_means = KMeans(n_clusters=3, random_state=0)
    ; A: E' ^9 M" k. S) g& w' _  P$ f4 f; d1 L1 u( @1 Q% d+ \
    # Train the model using the training sets and check score
    9 A! P4 {. E  l$ e: b& tmodel.fit(X)  k0 ], o' d: ?# b7 n( E

    5 P( }& D9 G$ S  i5 m, @! W#Predict Output: g7 c. ~; c( J' I9 B
    predicted= model.predict(x_test)
    - [( L+ U$ K5 v7 z9 }# r! u8.随机森林8 \3 q8 U* q7 W- f; t0 j; G9 }
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。4 ~+ r9 z3 u! b' p& \: ^

      R* m! \# |$ u! A4 ]+ y怎样生成决策树:$ P, {2 Y! w$ _" X
    * q$ A3 t$ Y4 X0 v* e& W9 R- G
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    4 s! b& r& V3 s0 u
    8 S8 L% V$ |# B如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。! a" k, N5 _+ G% N

    ( U8 F, `- [4 S9 v8 y" @1 \每个决策树都最大程度上进行分割,没有剪枝。( S$ ]; Z3 F8 R' {7 s5 d' \" d) l
      A+ {  K7 P& k# \
    #Import Library
    5 H" F( y7 h0 r5 [. O/ m, ]6 |from sklearn.ensemble import RandomForestClassifier
    8 n2 O. K$ N; u#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    / r, V. W; N& Y* s" F3 n4 E0 `: R
    # Create Random Forest object. s3 K6 h; z( g! c% R+ F( Q
    model= RandomForestClassifier()
    7 D0 q: b$ e" P( g8 }: s: I! u9 b9 `1 u) R- s, Q, b
    # Train the model using the training sets and check score8 R2 x% C* y' ~) d2 Q- }! W
    model.fit(X, y); f. G( N( \& `( ~6 j: V

    ! B% S; B, \' W! A#Predict Output
    6 ~! W# [# ~" G* \predicted= model.predict(x_test)
    " \$ q: B0 ?8 Z! Q4 m9.降维算法(Dimensionality Reduction Algorithms)
    3 e% v0 E3 c2 g" {4 G在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    7 u. c* U9 Y: Z% X" }) i# l
    * C3 f% |5 ?) d& g5 J" r- W+ [$ C8 |例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。$ y; V& a; k- n9 v: w
    ) \( q( O3 ]- y2 l
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。# x0 D. t  g9 Z8 _$ d, m
    . G- _' w" U1 c  a9 u7 u9 n
    4 _  t( _9 H* Q* s! |
    #Import Library
    ' m8 j( G$ g4 z% Vfrom sklearn import decomposition
    9 A( M' l. v' O5 ~#Assumed you have training and test data set as train and test. n" D2 \" Y0 F, n0 [7 r3 u
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    & ]. E# y+ }0 I/ u2 e- y% Q# For Factor analysis! }! t% o5 t8 p) v1 Z" I
    #fa= decomposition.FactorAnalysis()  I" ~; H/ a2 y( _( \# C: Y
    # Reduced the dimension of training dataset using PCA3 Q; C# y; [- p

    3 ~$ Y# X: L" Z7 ]train_reduced = pca.fit_transform(train)+ @3 G& @! Z9 L
    + U" B$ K7 H4 p# X! y2 s
    #Reduced the dimension of test dataset5 ]* k& M4 a; M8 S  b% \4 a5 e
    test_reduced = pca.transform(test)
    : C: F7 d& \+ _" E/ c6 M10.Gradient Boosing 和 AdaBoost8 u; m  e  D1 G
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。1 X- p- f' [* [8 V
    ( |1 X; w+ j8 {( R4 p- |
    #Import Library
    2 A% O1 O6 D6 L. Q6 k* Tfrom sklearn.ensemble import GradientBoostingClassifier
    4 P; u5 w; F# G; O: g#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    2 \. b- r: Q0 K  b2 C' N# Create Gradient Boosting Classifier object
    + u) v: b2 _3 W( _. V5 zmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    % W0 Y  z! I- Z
    " Q3 J& [, ?- Z% |0 v  E# Train the model using the training sets and check score
    8 _! W8 H- y( H7 G# C1 |model.fit(X, y)  u6 l8 e" }! R: w6 O. i) b
    #Predict Output
    7 o, ~  L5 B- C0 epredicted= model.predict(x_test)" M; d$ U. [; G% E% v" R
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。% J. V5 _  \1 M/ p3 I
    4 h; f0 e8 _- u8 v' w* w* h3 l3 M
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    : G" D0 F" J+ z5 j————————————————* t( G* m4 F/ F. A# N& O3 Y) A( g9 s
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 s6 p" q' v/ d: c* ^
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    - d9 ]4 e. V- c3 ?% z3 c" E( `* v5 _$ x4 v# \% B
    & D$ @/ t$ N6 z8 d" |
    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 22:35 , Processed in 0.461521 second(s), 51 queries .

    回顶部