QQ登录

只需要一步,快速开始

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

    $ ]; y( s2 Z5 D6 G  Y机器学习算法整理(内含代码)1 s9 ?* M8 w9 u0 ^
    ( T5 b+ {$ l/ j
    一般来说,机器学习有三种算法:
    $ y; G5 O" {# F+ J+ c$ S5 L! y" Y4 c* |7 [
    1.监督式学习
    % ^* P0 b7 V/ [' d' [6 g; s$ J7 M! W
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率/ \: d8 W" {' u

    9 X' H2 k( X, `属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    9 S0 |! L' @' ^; E1 z5 Y* Y" x- k  e) l/ _
    2.无监督式算法
    ' F: }, G# v6 `( ^/ ?
    ! M+ k7 ^: Z8 g. s. ^0 o无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    : J5 j2 F; _+ {& g/ v3 Q. T* Z7 d8 p4 q; G9 q# P4 I& i3 c, P/ t5 `
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    ; i/ @$ F/ b" x2 ~4 Z$ l; x# |7 Z* b0 N8 T3 [( i$ t
    3.强化学习5 y4 g: {5 ~6 d- w0 I# |/ l' ?2 {9 j

    9 V  N$ E* Z0 x4 B6 a6 U这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    " m  \& ]) E' h5 ]
    * e: F" ]! @& v) {' M* j属于强化学习的算法有:马尔可夫决策过程
    , h2 ^+ D% s- x8 Y! [) [
    ) Q! A: J) P# c# X) X4 f常见的机器学习算法有:
    3 T2 z7 J  F: }# h8 h% f8 Z( l# g
    + w) c1 w" N, D6 p: s" A
    8 E& s5 ?( c( }" Q" l( y1.线性回归 (Linear Regression)# ^) y: w: l: I$ H% [

    1 G5 V/ E/ O& `1 r( V6 k: U" F2 n2.逻辑回归 (Logistic Regression)# t* ]% |, H2 W* D

    4 `: q/ l) `: j: r8 F3.决策树 (Decision Tree)0 S( A5 T$ \# E/ M( p
      K: E/ H6 D0 l% z& O. w) P
    4.支持向量机(SVM)( o+ R* V/ t# Q2 N- P( Y6 H
    + T, P; l: J4 t/ x
    5.朴素贝叶斯 (Naive Bayes)
    : B1 d  Q. |! b
    - w% F2 M% J4 N6.K邻近算法(KNN)7 L1 h6 Z. L# w
    - ?- L5 F% [; F8 J5 R- T6 P+ }
    7.K-均值算法(K-means)% m& |/ y1 b! d) M( ]6 a

    - w5 V4 T7 ~4 [. J8 d* ~, O/ C8.随机森林 (Random Forest)
    , w4 Z, Q5 t! q, e. W) |* D8 m, c8 ]# B7 H
    9.降低维度算法(Dimensionality Reduction Algorithms)
    9 H# H4 n3 E) i* C2 n; q! {9 b. V+ o3 p: n
    10.Gradient Boost和Adaboost算法
    ) |- X+ B3 _2 Q1 l% k' P# F( T! N一个一个来说:) n5 H; X. {- Z) {/ @
    1.线性回归
    / r- M7 t# a& p
    ; _+ F  v. k* |线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    / _" F# M6 M2 r0 Y6 Q' t: ?# B' g! T" U$ n9 c" w& C$ y5 i/ p* I8 Q
    在这个Y=ax+b这个公式里:: B: a; ^% j  E# I$ ^# O+ i+ {/ M
    + ^9 p! }2 A* g$ Y: Y1 ^, s0 ?
    Y=因变量
    $ X  F/ h- x9 P8 Q" W$ Z* H
    0 \+ I5 b: }1 J: V8 U7 T/ j a =斜率' F% r- ^. F( K! G" q

      O6 P3 [# l) n2 S. q  U" w x=自变量
    / z( y  S" {/ T% N; I: |* w# G; w4 s! R+ r3 @) J3 [
    b=截距( l$ z% |2 B6 S  N& C; Y
    1 @* v  O) J3 J
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
      y8 u, @  c1 m5 q" g% _0 o) I+ b$ g# L! T+ x5 u( A. E9 H/ u
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。( f& z: }8 v0 T( x( ?5 n

    0 [+ E, t4 u. X2 C8 J给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.0 G3 X, ?0 D7 I# y
    3 k" R4 b6 E* x, v

    - A% K. C9 N* E% G3 U! I# V5 ~) M( |- I/ j
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    8 P9 L' B$ S' [! D' k8 ^0 X
    + H7 ^3 Y) Y" w, o6 q7 ]0 l/ H拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    8 ^* |- s2 t) g
    , L# _5 D0 P5 [" Z8 z1 lImport Library
      H* U: ~# s& j" ~) hfrom sklearn import linear_model# \7 n, u! c9 R# d  z+ ]% C* X

    # k1 z% }$ \6 ^" f9 d8 jx_train=input_variables_values_training_datasets
    - Q2 k% j/ x; x& F1 d7 Q5 }y_train=target_variables_values_training_datasets4 F, A9 ]% L4 p: m& b
    x_test=input_variables_values_test_datasets2 a5 R: G  O/ q2 ], G. T

    # r" X0 z  g/ w* s4 @; m# Create linear regression object
    " I( D2 Y- |" P- ^0 N% llinear = linear_model.LinearRegression()
    5 m0 {9 p/ m1 w& Y& H2 [. l, m4 R" [% R
    # Train the model using the training sets and check score
    ) V& k$ Z, \, M1 o9 ~linear.fit(x_train, y_train)
    9 q- d0 ~' }5 D1 Clinear.score(x_train, y_train)
    : |2 F  |3 E' Q5 i
    2 R/ G! t& @0 _' D#Equation coefficient and Intercept* G. f. D' l/ [* {3 |5 m7 ]
    print('Coefficient: \n', linear.coef_)% ^) K, O* [% D/ X- H  s- ]. G0 }
    print('Intercept: \n', linear.intercept_)' J* c0 p. q9 J1 B

    + I. I* {4 P" O" u5 w# i/ g. g#Predict Output
      o2 F7 l: _- [4 ]! E4 Dpredicted= linear.predict(x_test)
    4 l+ h( {  m( w2.逻辑回归
    ; l0 _1 E: z. ?+ a/ j逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    $ d; D/ z% ^  [8 w8 I. R3 M6 w9 S3 m: s0 G, x3 ~+ I
    同样用例子来理解:0 I3 h1 T0 I2 R* r: [- K

    & a& C; ]# Y3 Q) K* k假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    ; r) {9 u( {- M' d
    . |2 a' @2 x' a0 F# S. C) H' Q数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧! n; }0 M9 A: j, V) S+ m

    # Q1 b- d+ M: ?& X. Y最终事件的预测变量的线性组合就是:$ h9 R7 _8 x- A* V7 V6 q3 u- d8 q
    ) B3 a. r1 L9 ?- n+ C9 I

    ' r& G6 l0 u& dodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence6 i* s. l$ z6 u) ?# N
    % W3 A: d& s# A7 S: b5 C
    ln(odds) = ln(p/(1-p))7 p# ^. m7 A# @% m; O

    " `4 V* {* N( u  ^7 }logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk% [, J! r4 H& s, l+ I; j
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.) V5 X# ~1 @9 {: A- N" Y, N  O# H2 l
    ; v9 j/ m! F$ e! a* ^- _/ x% y
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    / ^; E& X% c5 F8 c0 _3 L' z' Q+ W
    . z$ u0 H- I1 V) H, w
    9 A) r, j3 Y7 I* ?% n& J' y7 D; t$ q, p6 u/ {
    from sklearn.linear_model import LogisticRegression/ k2 _9 s2 L) u4 I9 p- K
    & s( c1 O; H( e3 k* z: G$ F5 ?
    model = LogisticRegression()1 E( Q! f$ j! v7 P/ K* f; }, F  ~

    2 E* S$ B' P  Z! a# ~4 q # Train the model using the training sets and check score
    * `5 ?7 E# S: T* R6 Q% ^ model.fit(X, y)4 d' \) S/ B' ~* w
    model.score(X, y)
    ) y  l9 v/ m- l; V/ `* E& H! l
    ; c. F+ S* O9 d/ Z7 D6 L #Equation coefficient and Intercept& r# `7 X4 r0 a3 ^1 N. }
    print('Coefficient: \n', model.coef_)0 _& k- a! I/ s, t+ y
    print('Intercept: \n', model.intercept_)- ]& h, d, o6 ^3 D  l/ ^
    9 |7 V5 z: p  t( g4 F
    #Predict Output1 ^7 n  N4 j. p' @7 h
    predicted= model.predict(x_test): k3 O. M5 ~5 d5 O4 x- `2 e( _
    逻辑回归的优化:
    / @' l  L6 M3 k& W4 B% J! @, ^加入交互项
    * K0 _4 i1 f! q! S* i) w7 q1 y' C! t
    2 F- b, G) f: Z3 k  减少特征变量
    5 T) T% k( ?' p" H9 Z4 O% X6 i3 a1 b9 ~. c* U3 [2 |
      正则化3 B7 K2 p3 z  H& D  ~! E7 O

    2 x# q$ W* }3 O' l5 c$ p# y& `& W  使用非线性模型- H2 _  g) J" \( r: ?
    6 q% [; ]! x9 o. f8 l" ~
    3.决策树
    3 c5 A6 G, y; f" d# ]* _这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。; P; u9 T0 m3 [+ p4 e; i- b
    2 u! K9 n9 S, ~
    ; q- N# T) R" _7 C: x
    ( Y9 A& u2 Z& U7 Q/ i
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。2 A6 ]3 X! B& x" v/ X" o

    - ~6 `) y$ O+ T) j* G2 v* v# w
    , R7 ^4 i/ N( X  y  \from sklearn import tree
    3 |! R; [, U) d! s; D" C8 e( I; l
    . H. W# t5 ]7 Q
    * y# L5 M1 T2 m, ]3 B# Create tree object
    . k, {' I% M) @2 ymodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    ) b; H4 `! U* Q- \! n: ~; Q# ~7 R, |# N0 K+ X$ f, x
    # model = tree.DecisionTreeRegressor() for regression
    % U" S, j- `" R5 ~0 d3 j; }; V+ f" \/ H6 j- c4 R4 E: Q5 S! u
    # Train the model using the training sets and check score6 q1 Z5 O, U( ?  s6 x/ W
    model.fit(X, y)
    . L3 R% l, _0 K- J# dmodel.score(X, y)
    : k1 l9 M7 y) S; F( I: V  D* n5 Z. y8 k, O& K0 v* p4 {6 }/ b
    #Predict Output
    ( o% C  w2 k2 Upredicted= model.predict(x_test)
      A$ t3 V: C+ X4 L4. 支持向量机(SVM)
    8 Y; E6 E' R  O这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。7 Q8 l% W4 S9 l! W1 a
    . v& B  x3 H; \
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。9 }: h) x5 i  ?2 ~, y' B

    0 T' R2 I8 v$ }  L
    " q- `# {. M* b% Q8 _+ A; p# j" U( G
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。. u3 ~9 q" c4 r+ y+ o- K* p

    , ]& \# {% U; b  E4 n#Import Library
    0 p4 X% S1 l) Y9 |/ Yfrom sklearn import svm! V8 w) N' I' H! v
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : [' b8 _6 E: W' j1 S0 F9 w# Create SVM classification object + {$ k0 Q' g1 Y' A; d

    4 J. Q) g5 R" d/ cmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    & L& _  E) T, B& d9 |+ X
    2 [8 n8 \8 R$ ]- i" t* G# Train the model using the training sets and check score
    8 d6 r) c# z9 z- ]- X, q- Rmodel.fit(X, y)
    ! g! C( z- [2 N! V6 H1 e9 Lmodel.score(X, y)- r, d& K6 X& k/ d% n  o

    ' l3 H4 B0 @) Z8 ^& Q5 T2 {#Predict Output5 b4 v( X6 Y# I% m
    predicted= model.predict(x_test)2 [7 \% \. E/ b: z4 }% E8 S. ^
    5. 朴素贝叶斯  q/ q5 E: }1 K  }
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    : t* ], U3 B0 K
    ( {1 q# t0 k* n# w7 t朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    + w" N3 {( ]$ `) ]" ]9 {: n& @# h" j/ _3 d
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:# ~% p+ ^6 X. s' r4 y

    ( C% y; G+ @( c7 \
    ! Z1 d' K* S8 Z' ]8 W) V$ I, FP(c|x)是已知特征x而分类为c的后验概率。5 S, j/ p$ s7 ^  ~
    2 z1 E0 f# d' s# _$ `
    P(c)是种类c的先验概率。
    : l' G0 q# j( |
    ( d- |7 T' ]) G. t% HP(x|c)是种类c具有特征x的可能性。
    4 F5 d2 h7 a- _; d- ~: c
    8 l5 U4 V2 x( _' n' P8 u0 _( uP(x)是特征x的先验概率。9 K9 A) o: a3 W( D8 R
    5 k' N5 p  e: ?* K
    ) ~4 a! A- Q# ?1 w9 s
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    / }4 L% H' W) a# M: W
    . [  a( z+ V) g5 a* ]步骤1:根据已知数据做频率表
      ~4 d# y( {( c: g* p3 Y( ]4 M1 |
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    2 R, e7 W$ K) I9 T+ W. H+ I8 E4 e# M* P* B% N5 M7 B+ W/ b

    / g+ P1 D* y6 x1 r. T0 }步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。" O6 s0 b, |# v6 R9 w
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
      _7 ~$ O$ d: @2 a( S  T
    7 V) T+ ]" q  B0 g: Q( p* w我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。! Y& ?0 b- R$ y% h
    : N4 B4 D: K% Z4 D% F
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。& u, b* n- ]' B. B# l7 @

    & i( _7 b+ w" y# J+ U那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    # W& c  E% F0 g+ c8 W7 ?
    1 d, j/ G, E& V1 ^% S0 B# r; k8 |当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    5 f7 Q) Y. ?% L3 h) P3 D4 |+ w7 p, t" y/ D; _( @( N4 o
    #Import Library
    * q7 X; L) b, k* Dfrom sklearn.naive_bayes import GaussianNB
    ) M$ ^. ?9 i8 }/ O0 g! f) j#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset' n- M" V( g8 c- Q% o
    4 Y$ e5 z! n& ?- h
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link/ k* B! \9 Q" b* }! V9 p
    " M; y$ ]$ B$ i
    # Train the model using the training sets and check score! j  q. }2 l0 W
    model.fit(X, y)
    6 b' ]* N. w' |. W7 h
    & r) G$ t# d, O. C1 T; y+ U#Predict Output
    ; G& N# Y5 t2 S0 Q- p( f, jpredicted= model.predict(x_test)" z: H( A! _3 A: I  B. o; g3 G) t! q
    6.KNN(K-邻近算法)
    + H$ l+ C) \( [, Q这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。& p8 G& w5 H! {7 b; L% P. _( R3 G$ ~

    ! a9 ^: |' F: E, x2 j' y8 y距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    ; F$ v0 n5 C* x6 o6 R' }7 c( V4 h
    ) C# _) i4 p1 d! ?/ n, z- y/ B

    / ~3 n  V; V% B- P8 RKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    4 b! H3 g9 ]4 B; p9 p! j
    ' |! I% ?) s$ w) J6 I: q% E在用KNN前你需要考虑到:
    3 ^; e6 q! Z9 X2 v% p# f  a) \# T# d. q
    KNN的计算成本很高8 i+ M9 `, k0 y1 A& _! a
    4 i% O( E, H* w
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。7 r+ a! R& ^+ v5 [! W& \  U& M/ Q

    + A* K% a! u  G! C" i, N- h在进行KNN前预处理数据,例如去除异常值,噪音等。
    ! K2 K3 w  B; `. Q7 N4 B) e% o" j. O
    #Import Library# g& t+ ?9 G8 j1 J
    from sklearn.neighbors import KNeighborsClassifier1 P' J, h5 u3 g

    1 c1 r6 d1 o6 e+ H0 @#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset( k, [. @8 O3 e& V/ c
    # Create KNeighbors classifier object model
    # }$ y- T) t$ U
    : g& Y9 z' Z' B  U' n  b* cKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    7 v7 F/ ~1 o7 m/ b7 k( r, U
    5 r" p6 z; j: s2 u" h# Train the model using the training sets and check score
    & u0 ~5 v! @/ H' t: d: I0 R9 j5 D2 nmodel.fit(X, y)" b; H1 R: ~9 d3 L

    - _" R# S0 W; H6 X4 n2 I+ ]6 j. s#Predict Output
    + r# U4 [* ]5 i7 |* h/ }6 Wpredicted= model.predict(x_test)+ N4 P6 E$ X+ D6 k& {: z! c
    7. K均值算法(K-Means)4 }4 D1 u5 [! C- {$ I
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。# ^9 y% w) J7 U. J+ c2 i1 k4 V
    0 x* ?( t- W3 w0 j
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    # V) r' z4 r! Z( h# m
    # R( B( f* ?  R' R# D) V( a2 A
    ) }% D. j; q* V8 G9 f! W8 \+ G! L, @K均值算法如何划分集群:0 m; {+ e# G4 i  N7 q5 n3 I1 W
    % r. ]6 b, r8 R  j0 m6 v3 x
    ' w# {, w6 k* m, }$ m  `' b2 H

    9 J2 e1 D  S4 `7 u8 e从每个集群中选取K个数据点作为质心(centroids)。/ y( L& l: O0 Z" b8 X5 y
    5 ]' m  K% b7 M& _
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    3 }) H- i1 w' f7 `! o8 B" r" \7 E7 T( l
    找出新集群的质心,这样就有了新的质心。3 h* m# K) Y. b1 Q

    * C8 Z3 E4 P2 n3 ?! }& a重复2和3,直到结果收敛,即不再有新的质心出现。& i/ p: E4 |* p
    0 w3 c. f7 d% {' E! t
      J) E; Y1 u2 z8 x" U; p
    怎样确定K的值:
    ; {3 c  u) z: \8 Z' U/ B8 r( c$ i- L: p% S
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。- J4 e! N" f+ u5 F7 i& q( I2 }. n
    8 n# _7 [3 ]: f! l9 I
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。8 i( N5 s6 L- [( N3 y/ N
    : ~/ h1 i- }) G3 `
    ! `& D& t1 }% H& K/ G
    #Import Library6 @6 a6 e) Z% B- ]" M: S6 O
    from sklearn.cluster import KMeans+ f" `- n7 p& v
    - z8 ]% o9 q5 E- [5 R5 H
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    & [* i1 c6 \( e1 q+ y# Create KNeighbors classifier object model + v7 o5 X7 k; K
    k_means = KMeans(n_clusters=3, random_state=0). `8 I) y& E- z# s8 `
    $ D! R2 P* i( X8 x" |/ |
    # Train the model using the training sets and check score
    4 T( h! J) d5 i! h5 Xmodel.fit(X)2 _2 L: P* v+ z

    % z3 u0 T3 b9 J6 i" m#Predict Output3 |2 V3 d5 g5 b: J
    predicted= model.predict(x_test), l, c0 p) u3 m. ^
    8.随机森林
    0 E- s' d6 j# O5 T+ C随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    1 }2 V* N: U) s1 V* k; K
    9 f2 |: z% p  ~( U6 [怎样生成决策树:# ~4 E5 R6 S! b4 p
    1 e- B) d) e4 e7 Z
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。' N$ [7 _: K9 p2 s& ^7 S

    % J: a* j, X4 v# r6 p1 K. D如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。0 C$ g; g; [0 d& _/ q& h' f' h$ S
    & ]# |# V! Z0 k* n$ x# c
    每个决策树都最大程度上进行分割,没有剪枝。
    6 K( X3 h3 D: @8 W# j" F5 M; Y
    #Import Library
    - j4 ~( e& ~/ Sfrom sklearn.ensemble import RandomForestClassifier
    . Q- w  Q, n( |6 [7 u#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    & m( S. P- ^$ u( x# g8 q- |. M% }7 v% l- W8 U: A! }) @* o
    # Create Random Forest object
    ) B9 s* W' p8 Gmodel= RandomForestClassifier()& l! p: f3 `/ Q4 `5 z( T
    * c" T' }+ {) U3 r/ w9 G% i% e
    # Train the model using the training sets and check score8 A' F) j+ x; i) R. p& Q
    model.fit(X, y)
    0 M+ A" B! \- j! S8 [; L/ @7 k0 r
    #Predict Output6 s. b$ e. O3 S, F0 ~# k" k- I5 G
    predicted= model.predict(x_test)
    0 |8 X* L  x+ q/ S; Y- W) Q% \9.降维算法(Dimensionality Reduction Algorithms)
    ) N0 R, J3 t7 j5 v' F1 C在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。! d4 i1 L/ U9 j4 J% \+ E

    3 |6 n: |$ I# C4 O4 M, J9 {例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。% W3 n4 Q# b& G0 C
    4 p2 T& y1 v. s$ y! R
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。  m" }+ g  }; g0 G

    0 ~' J8 T! K% u7 ?& f1 [4 R3 i6 g9 o; `
    #Import Library
      q5 b, B* @5 u( L: }' {5 `& Mfrom sklearn import decomposition
    ' l' J  H" G, J* G#Assumed you have training and test data set as train and test0 z4 h- ^% [" f2 H4 j' x0 q
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)  ~% H' ]( A" \0 U) G
    # For Factor analysis2 B3 i8 S' }; w
    #fa= decomposition.FactorAnalysis()& ?$ p8 m7 S- g1 t3 B, `7 x
    # Reduced the dimension of training dataset using PCA' M6 b9 w6 K# p) a! G! J; C

    9 K; Z( A) ]% C3 C% @( Htrain_reduced = pca.fit_transform(train)
    / B- l4 k! a7 k, f' b: L. h: V$ z5 }
    #Reduced the dimension of test dataset
    8 T" ^$ E- ?; m" W$ Ntest_reduced = pca.transform(test)
    0 [; `/ t& e7 h* S6 F5 t; D10.Gradient Boosing 和 AdaBoost; s) s5 f  |+ g! M
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。7 I$ o# \' e# Z$ I4 B; j

    0 f: f" w9 n$ M, A/ S#Import Library! u3 v  d; R4 q; h8 w" @
    from sklearn.ensemble import GradientBoostingClassifier
    ! o& T; }: x0 j* c8 _; x" [  J9 H9 i; c; n& V#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 Y& U: o$ e2 G+ l" f
    # Create Gradient Boosting Classifier object; C2 P  K+ X0 Y# P( I5 s
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    4 }$ o1 j# M2 l4 [8 y. a0 D  J2 ?1 `, K/ e4 J( _, a
    # Train the model using the training sets and check score
    8 z( D, l! I5 Umodel.fit(X, y)8 W+ J) r' d1 E+ ]* Q  H7 Q
    #Predict Output
      Q: X) I$ \. G- H2 upredicted= model.predict(x_test); G- L8 X! d  J3 s+ p
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    # ^2 M1 f# E, k  R! r* I$ t  E6 {8 p# d: T8 n4 |, X7 F: E) m3 k9 z
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386/ J) s0 R' k( F; j: }
    ————————————————. D5 F" P0 P. Y- i: S8 s
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  R, \' ]! x2 L" ?! M
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    9 Z, M  ~: U4 U$ F- T: h. d6 F- G- y5 K1 z

    ! @( ]. p! j3 _! w- f
    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-9-8 21:10 , Processed in 0.731143 second(s), 50 queries .

    回顶部