QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2211|回复: 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
    % B# F- M* Q* V' }. M% O( o
    机器学习算法整理(内含代码)( c3 y" P8 f" k! v
    - u: P; O& k' }1 g( l7 P
    一般来说,机器学习有三种算法:  Q; j& C) e+ @: \" W4 ]* A: E
    " u. R. q9 G5 ~3 k5 x9 c' f
    1.监督式学习
    # _2 O; {% L8 n4 _* h2 n8 |( q9 p& a8 x  D0 U- [+ J8 N' N
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率# Q* d, F. f$ [! {* a. u

    $ Y- @% t7 r- Y' D* k( ~  z属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法4 j% M1 b1 I1 Z& P/ N

    ' K, z0 P4 T3 F7 Y, _% V8 b2.无监督式算法) v+ o# f6 z& J! o

    8 Q0 y6 A; S8 G1 n6 U7 a4 g6 a$ c无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    0 Y# I7 E- ^$ n" F: D5 Z' b; U4 W$ e% Q, \5 ~
    属于无监督式学习的算法有:关联规则,K-means聚类算法等$ X6 {- B& }, Y$ }

    + B, J* F/ g% Y- Y3 f  }% D9 R. Z8 C3.强化学习
    ! p5 q) Y" @' C8 p
    ' n  \! G  A& C& u, A这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    3 b, n) r% L3 R3 i1 H0 X% U) n, I/ d# u: p8 J- o7 T
    属于强化学习的算法有:马尔可夫决策过程
    # T/ H! @% e/ d9 k7 c( m( _# U) J- a! n8 n
    常见的机器学习算法有:
    6 B3 V& U! F2 X( F5 }) B* p: g2 b0 m+ n$ y/ v0 A

    4 V9 C8 D" C1 J1.线性回归 (Linear Regression)* d# ]& O- a6 P8 n8 s

    - R+ u" o) {1 D/ E; K2.逻辑回归 (Logistic Regression)4 }7 u  d/ _/ n4 S  a

    - A6 v$ l, s0 o# n3 X" L3.决策树 (Decision Tree)) H& m. ]$ p" [
    - R) Q6 ~2 x3 K" _
    4.支持向量机(SVM)2 Y6 O- v( m' ]3 J% }

    ) {" ?, g+ z( @0 B' V) O8 H, E5.朴素贝叶斯 (Naive Bayes)! m- Y! {. W+ R

    - h" L9 S7 H! |1 b5 k  {4 h4 ]6.K邻近算法(KNN)" \0 o  q) N" ?) n0 a: e  P  }/ W
    % Z! S4 e, g6 {) _
    7.K-均值算法(K-means)4 G( s" p5 \  W( y  p( a) e& i
    3 p9 N8 {! L. t' g( ]5 P. C) i
    8.随机森林 (Random Forest)
    $ H5 o1 N! `! n. ~# W4 }
    2 R) S6 O7 f$ F+ E# f4 S3 M9.降低维度算法(Dimensionality Reduction Algorithms)! \$ S3 s2 r7 [

    ! N7 P2 Z4 \' m, B7 u/ d10.Gradient Boost和Adaboost算法
      ~4 `) N  T# c9 T0 B) p! H& p( A一个一个来说:9 }3 t* o4 N' {# t
    1.线性回归
    % h4 q# L# e7 s" Z' O5 ~
    + ~7 `# D& W) t6 A- q线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.! A- o/ W2 ?1 x5 \9 T$ t

    % R) h! M: s1 t8 F. S. ]! p在这个Y=ax+b这个公式里:
    ) O. @$ F, I0 h  F1 k+ s* ?4 M
    8 I1 ]3 Q1 j2 w Y=因变量' g# {/ o( K! E( C% B
    - {" F/ f5 K5 Y; P% o+ H. j: Q- T* h
    a =斜率6 p  ?& z# f* u' \: _

    8 K' Z) {3 e% d' W" D- q# o x=自变量
    8 g  t7 c: r7 k' w& B1 [# `. a/ {2 G. l% p% R
    b=截距
    . @# X+ F* ^- Q: \: U! g, R0 q. ?% b/ B7 O
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    $ c3 U9 V* S$ u3 P: i! J' |
    ' q0 V- b2 \( W9 `, N1 e我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。: R8 J" ?# m& w0 C) n

    0 g, S5 ^' ~8 x  }给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    + x: m/ T, r' L7 Y/ y
    - I0 s; I9 K, g. _3 e$ @
    # P  q4 X( ?# U) c% E% H4 c% |( K- B* G& x4 W6 p
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    ; @3 i# I1 B  H+ D2 d
    ! [( w1 _% t  A- @拟合多元线性回归的时候,可以利用多项式回归或曲线回归2 C% V  z$ O% y. n! x3 f% g
    % [0 C$ ^  n0 i4 _3 }+ p' a7 {4 P# Z' U
    Import Library
    9 H9 D3 f1 ~4 E) [# X9 I) J3 }from sklearn import linear_model
    % l* z8 U" E, B' |) O9 ~9 X; h' O. S9 R8 m
    x_train=input_variables_values_training_datasets
    - t, H9 Z3 j+ I$ G# k: D' e4 yy_train=target_variables_values_training_datasets
    5 e8 d- X5 Q$ d  E, {3 Bx_test=input_variables_values_test_datasets1 `8 ~$ x/ o/ ~, N& e

    7 X. M. [) R  V8 g, K# Create linear regression object
    : l7 K  \, O% ^$ i3 ^. ~linear = linear_model.LinearRegression()
    * O  \4 G: [3 t/ H' t* Q# [
    + a( C. }( y: T& Y; e# Train the model using the training sets and check score
    ' q8 l5 }) t+ r% R( Z% Wlinear.fit(x_train, y_train)7 }% p, U6 v0 M
    linear.score(x_train, y_train)
    . c& f' t+ v' q2 W/ Z3 x4 a/ x. @1 x
    #Equation coefficient and Intercept
    : g, f' v% U5 ~6 m# `print('Coefficient: \n', linear.coef_)
    , W; k/ z# y# n- D; U2 M) Uprint('Intercept: \n', linear.intercept_)4 K& h: L; A0 V

    2 b8 v/ V, ~5 K6 K#Predict Output
    1 _. J7 h2 ]% \' S' H1 o6 spredicted= linear.predict(x_test)/ a2 V+ Q: B2 {
    2.逻辑回归
    # k- D$ h' p% C0 ~, k* |* @逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!2 [6 s6 ~3 Q" v' P

    - U" s" _2 Z( }) v9 `同样用例子来理解:
    % C! Q# ?% E' p8 o% x6 w8 g- ?7 y& m5 w# Y
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。+ B1 q& `4 ~7 H
    9 x8 n2 r( h/ G5 B3 `5 X
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    ' q9 Y4 O, S* j& r  Q6 l7 G% `, C5 h+ E5 ~6 m& C- \  j4 V# Y
    最终事件的预测变量的线性组合就是:; R& P, k! F# t7 R, ~' S% L" r* M
    6 F' _; L2 P0 c0 j- E  v4 S6 f

    6 e0 O/ }- N/ {" H( e8 jodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence. D! F/ ~) W( \& R' x

    2 ^9 |+ i: }4 qln(odds) = ln(p/(1-p))8 l7 J3 Z# n5 O$ @3 d4 D( [$ ~
    $ G0 L" L5 R: u# N
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    1 G3 W4 v' j$ w: O1 H: A在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和./ V- _% x2 B; R' \, m; n

    5 ~+ A0 }# [/ s5 e; ?0 T至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
      P! g4 L! T7 _* ?6 a3 A& l; Z( G6 m& |
    2 k% \3 u- g) A; K2 k
    : i+ ]7 e- e' p* _" [1 Q
    from sklearn.linear_model import LogisticRegression( f3 V3 s4 W) \) Z
    # ]/ M# E' M% p  U
    model = LogisticRegression()
    ! g" z6 k; ], |
    2 \, y- Q5 c0 @ # Train the model using the training sets and check score
    0 A- \# y& L- A) P( M( @3 ]7 o model.fit(X, y)
      ~$ b; J- y- c4 I+ g model.score(X, y)
    6 ~* ~+ y/ R: w3 _. Y! X0 l6 H0 E
    1 V0 o  I1 F; ~" \ #Equation coefficient and Intercept
    . l# ]# L  l# q" A  e$ S4 M print('Coefficient: \n', model.coef_)
    / [2 d3 Y" P- |* G0 E" Y: r print('Intercept: \n', model.intercept_)
    , c: F7 n, ~. h; _( e
    , J* t% r; n: Y* ~/ p$ p* V) Z #Predict Output. q/ \% _6 w" E* @, w4 q& O8 s
    predicted= model.predict(x_test). E: M4 M: D% E0 |
    逻辑回归的优化:" s  D& p* A9 G+ Q5 L8 C
    加入交互项! P3 M% n+ E8 F- u0 X

    ' X% ]  ]& n7 a- a* j) W; Y  减少特征变量
    , F1 O1 s! B& h8 i  W' {+ J6 b; \+ z  v/ z# Y/ l# p# @0 x
      正则化
    ( k5 v0 D: Q& Y+ K2 i- c$ [5 z; V. M* ~* b7 N5 C
      使用非线性模型
    % ]# C* ^( X) V1 y5 G( n
    9 F- ]! U4 O1 e3 ?3.决策树
    0 ~( f: s& e0 p& L' r( h; R这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。; _/ u: R  c# ?. H+ l
    6 a( t$ }- t- z5 K) p8 z

    8 @3 G5 V4 U) i* s/ m6 t/ I: G# e0 O
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。6 Q3 H! B3 M4 w, i+ q& u" p! V6 J) c

    - ^  J6 a3 K( u! `0 T" [5 D
    1 Y( A0 x' U- D3 m1 q9 P6 k# |7 ifrom sklearn import tree5 `6 r5 H1 B( H1 \- h
    , w. R% ?/ ]* u* P" t" M) E

    6 {" t! [9 X- `( ?- C' Z: Y# Create tree object
    1 G9 T, a0 C" M! ^- w( K/ F3 ?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  O+ r4 T) g% P7 y, k: P- Z3 K( b( q3 V3 k: `/ l8 x/ Q
    # model = tree.DecisionTreeRegressor() for regression
    / \- q3 a: f" x, k% U) s9 u2 C* a: b- y
    4 Q/ E5 b* z% z. N# Train the model using the training sets and check score. p% _; X. c3 c2 y. p
    model.fit(X, y)
    ! w# ~) ?8 r  u$ gmodel.score(X, y)9 c  E2 `$ T$ m- i. b4 Z

    % Y- l! B: M7 ^3 D" Z#Predict Output' Y# @9 A) C( P3 m$ P' X. j
    predicted= model.predict(x_test)
    2 f7 ~0 _; Y3 ]$ ^) |. n4. 支持向量机(SVM)
    8 f* _* F2 f4 C! W这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。7 F4 x0 a: A- F8 d+ M- |

    # U7 K% J1 R; m- l  ~% z现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    / z4 ]$ B7 |: H5 @4 f/ [$ ]- U0 G. ]) e$ m3 @

    + l6 Y- n$ g# x) t- n* c$ |& z) h" R: p* R( x' a0 p1 D
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    5 U/ _3 c4 ]( G# g* H4 j
    ( q. V5 q+ ^+ k+ v#Import Library
    % {! a& x# \0 p4 Rfrom sklearn import svm- m5 c6 F/ m- M) `2 {( Z% e5 m
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ) u9 C( F& v$ W4 o, D# Create SVM classification object
    6 }  Q2 Q9 |- l3 v& K9 u) D" n
    " L2 J# c- }: S; `* g- i% emodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    6 Y2 f' h3 c: r
    8 J2 Q! {' c/ H3 N6 |! r% A# Train the model using the training sets and check score$ Y! p. @. C' o  I' b. {9 ^
    model.fit(X, y)$ B9 m  M" A& P
    model.score(X, y): c. x$ T3 f# D( H" G
    , d" {. E/ C7 S5 Z
    #Predict Output" |6 S6 w3 h( Z: N
    predicted= model.predict(x_test); O5 x3 n8 P4 F! P) W; [
    5. 朴素贝叶斯
    3 w9 x& t1 ?/ m+ n# ]# w, ?; r- i0 _这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    * s4 h2 h/ s# N
    * D; q2 u- H3 y0 ^朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    1 A5 d2 @% a4 b/ a+ x. y  w% C/ F8 i% b8 ]
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:' a* a5 O1 N) ~: m
    6 G% n$ l( E; o. P. |! v

    . I: v0 G5 _* k+ J: t' HP(c|x)是已知特征x而分类为c的后验概率。
    4 O  J( g9 W3 p. D  I/ q4 a" B! G$ H' n9 s) k* y3 H
    P(c)是种类c的先验概率。
    4 g) I- _9 V. ?! f8 c4 T. R. ]) G) p8 |( e
    P(x|c)是种类c具有特征x的可能性。
    8 z9 O! J7 Z) A- e: b  ]. ]7 ]" j; d- z
    P(x)是特征x的先验概率。
    4 I. F5 ^3 M; B2 U# z) V# r; x5 n! F5 V# ?7 O
    * s  f- G8 t: c% {( U7 s3 @2 {5 }
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    : {9 o' Z% ^3 Q3 W$ r; F
    - p% _, m# V! C0 f, T步骤1:根据已知数据做频率表  v4 X9 \" V. G# Y8 u
    7 V( W5 \+ B8 Q0 g- p
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    $ m6 e$ H! m! w- D. U4 X
      G3 o9 S1 W# V" V
    ) e, E. Z( C( m; o, N步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。; r' ~+ u4 b( W6 y9 a$ I
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?2 j6 O. U% G9 X. k- p2 O6 z( m" h
    . h+ W, y7 V/ v* u8 g
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。7 K( h3 P( \4 K& z+ k% A

      G4 {: |7 c1 Z# C' ?$ w0 G这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。8 J! X" Q0 q) k6 ?, x9 D
    & `& Q* n. O9 ], y! w" c
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    ! X  Q' B0 }  D& C, M2 C
    5 H- p8 ~6 Z6 Z0 s6 t4 q- C当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    * F1 N- ~6 P  y- U/ y+ h: K  w0 o3 S: X, o' G5 t5 z
    #Import Library
    + m# I! G1 N/ r9 ^0 M1 Vfrom sklearn.naive_bayes import GaussianNB( }! o' r3 S+ j- n! b
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    # y- F. f# ?8 _6 E
    & Q8 U" k+ i" Q) j( P& d+ [+ Z# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link# ]5 \; j8 a; a: ^$ F
    ( D1 h  `/ {* b, }% X  @
    # Train the model using the training sets and check score
    & x1 |, o2 F5 K+ m2 s5 p/ p& c+ mmodel.fit(X, y)8 ^, m% G1 k, K8 X6 T$ D$ R5 D
    , |* v5 P0 G2 r7 M+ e# H
    #Predict Output
    * z7 G  L& p# ]% ?* u' npredicted= model.predict(x_test)4 u8 X6 _; V0 X  h5 V
    6.KNN(K-邻近算法)
    2 N7 u! D' a% }1 \: ?这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。0 _1 T0 n3 C, @4 F& \6 l, P' X
    ( w! m! o; O6 S7 G8 Z, [2 m
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。0 @7 I  j' o6 y0 @, L' ^: ]
      d% P0 \& K5 I1 B9 P" R/ }
    & k' ]% V7 Y! A% Y
    6 K1 h. \+ w( q1 b' r
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。0 U. X* S! C, r  Q; l3 |
    6 Y+ G- `2 h0 x( I& s2 i2 e
    在用KNN前你需要考虑到:
    & w' ]# K( z) L4 z
    ; r" m  K2 ?" _( vKNN的计算成本很高: ]( t: m. s" a' P0 \, S
    $ b! ]% x+ @+ n
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。/ M$ B3 S" P1 w& l7 J

    % s, c0 n( i+ l8 ]# O" C3 E在进行KNN前预处理数据,例如去除异常值,噪音等。
    3 }; y  K8 Q. T: i  T2 m6 `& r, a. ^0 v, O3 N) f2 J' ?
    #Import Library
    - Q/ K. e( @3 U: o3 ]from sklearn.neighbors import KNeighborsClassifier
    2 A$ U3 H. F7 X3 ~' |% P5 b4 v! L7 t9 A5 R0 B& S* p0 P
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ' c. ~" c. f. m! k/ P: w% Q. B# Create KNeighbors classifier object model
    0 B, h& o' U& ?2 L2 L- u( h: j; h3 k$ N0 [' w
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    3 w1 s. S8 ^7 J/ U
    5 F& }. W2 y3 n- l; X; C# Train the model using the training sets and check score" p; ]% k3 J3 k3 Y5 D, N: {( j
    model.fit(X, y)" w8 c2 U& R3 m6 Z) y2 M# X3 x6 f
      ]0 w3 \  p5 b. Z  g5 Z# c. C
    #Predict Output' W( C, r- x% l, Y+ L% B" a% i
    predicted= model.predict(x_test)
    / |% \$ R, u( C' c9 g2 u" ]7. K均值算法(K-Means)
    2 z0 m$ C1 }1 [3 G* v; D2 J, W这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    ; j% B) e* R0 ]2 U' e3 t
    5 E# P2 @& G- f9 b# ]* {% k# G还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!) A0 n0 @0 _" H. c2 m9 K5 e

    0 M! [/ k" c7 C- J2 X7 J% F: K" s5 H. x9 H
    K均值算法如何划分集群:$ s: W/ e, e* L0 |" z3 u
    : ^. m3 E  K9 L: U( k7 N
    . I/ G  Q. ]" i. G; S. T" ~
    # e4 r5 T8 w* d2 ^5 Y
    从每个集群中选取K个数据点作为质心(centroids)。
      A4 @/ w$ u( r( k# w/ m9 o8 q, j" `9 g2 \) f! Y$ g
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。. v: E$ `) e$ _' ]6 U

    " Q) P3 K) M- D0 n找出新集群的质心,这样就有了新的质心。
    % C! t5 n- E; _. F+ B
    7 f9 S+ t& H+ S9 g2 `重复2和3,直到结果收敛,即不再有新的质心出现。
    - I  c& K8 P" ]( s
    1 z- u: p# m. N9 h0 X2 K7 y6 G# P, W) r4 a2 }* m. O9 W
    怎样确定K的值:
    8 S8 R3 m# E3 [, a1 g( A+ E( f! I2 ?+ N) Q- v2 A1 H
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    . u2 w# @% W2 z- g# t: j! l" ~* C- o) R7 e' E+ p  k9 W, q
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    / Z* l! F" J2 m, [! q% a
    8 A8 p9 `  H8 X+ a) Y
    1 V1 {# G/ }: k2 c* ~; z  F#Import Library3 E3 [/ }( C9 [* x; c' I
    from sklearn.cluster import KMeans
    # l6 s* K5 n7 e0 r) F+ _. e. j3 |& ?( r$ [
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset3 r+ l" Y) b. `, \/ I# t
    # Create KNeighbors classifier object model 5 O# F6 L& v1 f
    k_means = KMeans(n_clusters=3, random_state=0)
    - x- D% W9 }& e" @7 I! j, l# S9 \% W/ j
    # Train the model using the training sets and check score
    , I0 G" \/ Z, `2 Hmodel.fit(X)
    ; [/ T' L" I% e# F9 i# D$ _6 }/ S# e! F4 K
    #Predict Output2 E) A; a9 z# Q, X
    predicted= model.predict(x_test)
    1 ?+ Z9 R6 k! |3 D8.随机森林
    ( u6 w# K) V: |6 j& V" y随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。1 w: y' U8 x8 y" D$ y
    : G+ |3 Y. D- W. V
    怎样生成决策树:
      Q: M- j: `/ ?. G
    ) I- F9 Q2 c. E如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。. ^) C# {' |+ D  W8 i# y" `
    % Y# s! y8 s( q  k2 }5 a! p" J$ B  L
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。7 n3 F: @$ d! d* i- W8 \

      g1 c/ i' B; k$ ^8 r& z- O! p, b每个决策树都最大程度上进行分割,没有剪枝。
    ( R* D' W3 L+ [' Z( R. K: J: J7 J6 h! @  _+ }
    #Import Library1 }) ~5 L0 F/ g5 C, w- @3 j5 @
    from sklearn.ensemble import RandomForestClassifier2 i5 Y3 w. p% h' f3 r
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    1 i' r( X( l) p; k+ a/ ^
    : Y: ^7 ]' s/ A) y5 |8 F# Create Random Forest object
    # v' \  n- s$ U" a5 W  a1 Gmodel= RandomForestClassifier()
    7 V. {+ k1 U( g' _6 T' }4 Z2 _" U6 B3 F1 l; z. E
    # Train the model using the training sets and check score+ M/ ]' L. Q; c* \
    model.fit(X, y)
    6 Z, Z3 N3 d1 C5 p0 s
    0 l# S  p/ I( _) U1 U0 g#Predict Output; J( j7 @* ]1 S3 r
    predicted= model.predict(x_test)( H( W6 b0 u; h4 X6 z5 ]6 J! Y. c
    9.降维算法(Dimensionality Reduction Algorithms)
    7 k1 H; v/ o. k在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    ( G% y& r& A. T1 B. C
    ( \- Y4 V8 u7 V$ G/ x9 r例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。3 {6 `; n/ {# ^0 ~  }! d
    ; Z9 s# [* d& Y" B+ W: {# ?: w1 x
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    7 S8 ?1 K/ ]- r; Y& k+ ~& c. c. n, N/ G+ }

    3 t9 a% N! d& d& o8 I, g6 P#Import Library
    / J+ w) _7 k) c! |2 |% q" `from sklearn import decomposition
    , N5 I: o- B- \/ H" K9 }#Assumed you have training and test data set as train and test
    1 o( r) P" p! u# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    4 x0 y4 P# `" C& D; R( C# For Factor analysis
    ( E( m% y$ ~3 _$ K' u#fa= decomposition.FactorAnalysis()
    * D2 h) M5 S& D. Q) O# Reduced the dimension of training dataset using PCA% f9 z8 y0 j$ L/ f, B( l/ R8 A; t

    2 j) m" l# Z+ e1 }! Jtrain_reduced = pca.fit_transform(train)  v8 d' V2 {3 m
    6 T" d: r, `8 a( P9 i8 ?, w- O+ q9 S
    #Reduced the dimension of test dataset7 q; X; }: y/ P" D: A% I8 Y
    test_reduced = pca.transform(test). B+ N) c+ f; d1 H( [: {
    10.Gradient Boosing 和 AdaBoost; V; E. D# E* w4 `  v3 Q9 I" g
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。# ^( n% N4 F5 K5 V
    6 N& |9 N8 Q& Q0 i9 i3 |
    #Import Library, `3 ?. ?4 H& E( c
    from sklearn.ensemble import GradientBoostingClassifier2 w% ?3 R) S! ^# [4 W
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset) d- F3 I6 B6 U' H5 F# q# e
    # Create Gradient Boosting Classifier object
    9 i+ y! u" N, @model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    ) ?. a# ]8 V- I; @! |0 [3 Q: E, Q0 F: e7 l/ P% W, k
    # Train the model using the training sets and check score
    : a3 N; `. Q4 vmodel.fit(X, y)
    8 R, Y! b" F3 A& O  u9 \, M; X#Predict Output
      k; V. U- a' z8 O( J% ppredicted= model.predict(x_test)3 t9 d0 `2 s0 F7 S, B
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。  ~9 p: v* L1 S6 P( }
    , e4 i6 ?* J  R9 B& x1 X! b2 c
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386, S+ A/ K4 C$ x5 P7 j( w
    ————————————————
    , U. @/ J% |- b- H# d版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 u2 O; o& U. n) |
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    $ }# `0 G. S- e8 p* `7 f& b# N. ^, e
    & g: m, Y1 r7 E. y) b1 T2 P- C
    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:04 , Processed in 0.427382 second(s), 50 queries .

    回顶部