QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2241|回复: 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
    2 `/ [/ ?7 e. j/ o& F& G
    机器学习算法整理(内含代码)
    : i( ~: N4 c% ?4 y: J( F" G; z, F
    : |% i$ G1 \7 B) x$ ^一般来说,机器学习有三种算法:% M6 O% Z! T! i* p/ {6 n$ _. p

    ! C% e; p3 s' K- V: l, X0 Q1.监督式学习
    ( y8 H* R% S7 n2 u+ T6 @$ o2 N  h6 `# T4 E
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率1 L9 |) f! f1 B# l& [  q
    ; h3 d" `; h6 G- [+ q0 B
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法' P. x+ {, P( `/ K, T/ Y

    ' L% U, ]7 p- d/ {2.无监督式算法
    2 Q' n  \- |& w! a  D# g5 M/ ]2 J5 R4 J/ w" N+ e
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    5 ^, G& C+ m) _, t- ?5 _
    4 K  c- @7 D3 m, i- N0 D! F属于无监督式学习的算法有:关联规则,K-means聚类算法等
    ( x& G4 b+ n) z  Z& y9 ~: Q& V1 [7 @, o" o2 f8 {* R
    3.强化学习: f9 H3 i" b' B% L" K

    1 m2 g7 [  l4 G- y( V* r6 S. V) \这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定- K3 u1 O5 x( U
    / _# p# G% r( L
    属于强化学习的算法有:马尔可夫决策过程
    5 r6 @! J2 O& X9 l
    0 L* V; t2 Y5 n. ]5 X, Q常见的机器学习算法有:
    1 Y9 i$ L8 z8 ]7 d8 `9 ~+ ]( @$ c! k; A! u1 O" s4 C: N
    : ~6 @  E. x- ~- D
    1.线性回归 (Linear Regression)& D3 X; H' g5 V. g& N7 Y0 {) H
    1 H0 M  j) s0 H: i& @0 J
    2.逻辑回归 (Logistic Regression)1 j* T) i6 X! E/ ~: h5 x9 u5 `& J
    8 J$ b& U( M$ I2 w9 X
    3.决策树 (Decision Tree)9 U3 k+ y+ A- _: ?6 f. n5 C5 y0 a
    2 y% ]9 l1 I- p
    4.支持向量机(SVM)* Z5 u# E4 e# v+ a3 e
    ! s6 S- f2 G! h
    5.朴素贝叶斯 (Naive Bayes)8 |* v  u: W; P; k" a# Z
    8 k& I: Z$ Z( y3 ]
    6.K邻近算法(KNN)+ H  f0 i# |/ J0 n+ ^6 p7 p
    ! \2 R  p! `* V+ \0 x7 d
    7.K-均值算法(K-means)
      ]& _' s  ?% p4 K5 M+ S5 E; ?1 ?5 o. P* z
    8.随机森林 (Random Forest)
    % [5 s1 x" x; T& G  v7 r7 l, W- y
    * U; k" K# A7 f8 e! s3 S9.降低维度算法(Dimensionality Reduction Algorithms), d1 [. o2 I/ ^4 j8 W( C6 O# n! x

    & i; u4 n+ S6 v% ~10.Gradient Boost和Adaboost算法  N% Q2 h- J5 l* i' }
    一个一个来说:, f/ C' @* ?+ W& U6 b, T- C6 z' q' k
    1.线性回归
    + h( p3 W! y3 t. T. ]7 j% P
    ( w$ D1 V$ W5 |1 O& X线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.2 J9 y) E- h& @

    9 n4 U# d2 X, O; I6 H# Q7 ?在这个Y=ax+b这个公式里:
    0 V$ Z* A# Q+ q' {* ~& \2 O" J4 j0 |! ]* A- ]7 D4 z; X
    Y=因变量9 |. ~" x4 k' m$ _8 g8 _

    9 V" Z! U9 p* a5 T; Q a =斜率
    % X/ l, z9 k% X$ t: n3 u: Y/ B
    3 E# i8 T) ?  y x=自变量9 H% b* t& ^. \+ r1 G) K7 G% W& I

    5 F/ v  w2 O! N6 r/ p b=截距- a1 W' p& D0 X- R7 s2 \4 g$ n

    8 T6 H* S# b& S: [ a和b可以通过最下化因变量误差的平方和得到(最小二乘法)+ b5 \0 P* M' H; B4 a3 X# o# g  s
    1 |: x7 J4 ^' m" g$ w& r
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。# ?6 F1 b2 y& M
    0 D: o& W7 `; b( n  O, ]& P! ?+ _
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.  G+ n+ g0 F/ \1 O3 M

    ! g# L4 Q' _* ~( U* J9 I+ o* ]" u' ^- B

    2 |/ k( q* M/ u3 A线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.$ j# B, g* v: \

    ) T$ X8 K: |2 Z( x: N% w: M8 K6 A/ S拟合多元线性回归的时候,可以利用多项式回归或曲线回归2 p0 q2 x9 c+ I) ?( x* \2 d: g
    % I  F/ _8 k3 T. K9 u; K, M3 g# h# i5 X
    Import Library5 w( N; R8 M9 P6 C! F9 W
    from sklearn import linear_model
    : a# w7 G' y$ h5 ?; }. C/ _0 B7 c) I
    x_train=input_variables_values_training_datasets3 a( y$ j0 z+ f  u
    y_train=target_variables_values_training_datasets& f3 |; i: \* Z
    x_test=input_variables_values_test_datasets
      g/ x# p/ ?) G- R+ g7 v- b( t! g9 W* N
    # Create linear regression object
    $ u0 y; j8 j- @0 ?linear = linear_model.LinearRegression()
    , J* _; ~8 b! I+ @+ r: ]2 M4 ^$ v# _
    # Train the model using the training sets and check score6 y. a5 {8 G9 I: S" y: L$ Y6 p* _
    linear.fit(x_train, y_train)
    # c1 X. _% U6 K' Y+ j( W5 c1 Alinear.score(x_train, y_train)( O% T/ r% B! I' w
    : S: ]! i1 ]  H+ |  Z0 I
    #Equation coefficient and Intercept9 ]& v& ^& k( Q3 n5 d. e
    print('Coefficient: \n', linear.coef_)$ _- u; m" [" r. K/ z' c) ?8 I2 q
    print('Intercept: \n', linear.intercept_); \' W5 H/ V0 c  Y
    9 d  O0 y0 b# ]0 L* @- l' O  B
    #Predict Output
    - C7 S% Y+ R% q" ?4 hpredicted= linear.predict(x_test)( A5 u/ h' p5 h# {, ]; \7 e+ J
    2.逻辑回归
      X- w  o5 K: i- E$ i: y: x逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!4 J& `" U% d2 }$ J3 j8 B
      S& B- @; ]" {
    同样用例子来理解:8 Z! G* P8 X  x! U" p3 {
    ) u8 ?. c8 l% Z; O1 `1 ]
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。2 O0 e: k8 B7 b9 y7 ?8 h' K
    + f& @+ M& X0 S, ~
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    & o$ m1 W/ T: x( n
    , c6 j4 f1 y; @# Y9 E, c* I最终事件的预测变量的线性组合就是:& T( N# ]% }2 V1 r: s
    ) j: c6 ]2 A4 E5 [

    . T- A- R8 {( ^/ p: ]6 R; H2 {* u' Yodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence% L3 J* Z8 O; ]6 u3 I7 L

    - V5 V% @9 Y) {) yln(odds) = ln(p/(1-p))+ [6 \- X! O/ C/ J$ t) X

    - @2 S- ^  k% K" u# \: ~, Q' Vlogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    * S& i% o$ L4 C; e在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.$ d' @! j. b! y' K( z

    7 `4 A$ K$ p5 t8 ]+ C至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.' m( _/ W* W& g  D  N+ I

    " K* J$ g8 ^) L6 X0 g' @  K1 z, k" Z8 \- w8 r& ]

    / O! W& \5 V1 i2 X: b3 O3 b, @3 q from sklearn.linear_model import LogisticRegression
    ! G0 ~8 `* O- S  V# G9 }: z$ b9 X1 r: ^/ W. V
    model = LogisticRegression()
    + @0 t0 ^; e1 l. B" B$ y# G  H* z6 o8 L, ~5 m: F! x$ ~0 `
    # Train the model using the training sets and check score
    ; g7 F$ |- i' R; i model.fit(X, y)9 e# \6 m; ]/ b: h
    model.score(X, y)
    " T  |5 ]+ p# V( x  {7 D
    4 D5 r3 {9 R2 V, @7 V5 C( L #Equation coefficient and Intercept
      E: N# c) f3 _7 I+ N9 ~ print('Coefficient: \n', model.coef_)
    7 H4 I) x) |- a$ `6 e/ Z6 b/ Q( m" Y. q print('Intercept: \n', model.intercept_)% r. y8 H# v6 k* H4 B' Q

      ^0 O1 `3 S( h% ?9 V) y9 s& U# W# R #Predict Output
    3 `. @) d1 @0 {& }1 y predicted= model.predict(x_test)
    ! m5 e2 r4 w6 c9 U* }9 M' O3 e逻辑回归的优化:
    0 i- E7 m5 l4 V; l: X- D加入交互项1 ?9 v5 J  h' o% b

    ! }2 j/ Y9 H, w% L# X$ f- {  减少特征变量: E$ D" k! A: N7 ^+ J, ?, Z& c

    - T# s) [/ k8 B/ w  正则化: u5 j- n2 Z' ]- E1 Z2 A7 @( t& W/ }* \

    1 h4 s% I5 A- w- a# I6 E* n  使用非线性模型( K9 H1 G8 u# a4 l

    ! t9 U+ d1 R! V( x- n2 e6 \- I3.决策树
    6 _  X8 o' ^* j; c3 Q: O( z这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    3 F! B7 S6 ~  T
    % `; I, `3 z+ ?4 Q# i  s3 Z1 Q7 G
    % k$ [, o$ x" `# X: W& }# y1 j# B/ Q4 W  @" y. d5 a3 g
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    3 c) j- U# K% g6 a0 O. n) j2 m$ [% u& K
    # n* C: Z3 k& B0 y) |
    from sklearn import tree
    , E: g7 @% a& |; }* e2 ]5 V
    : ~; I  V  }9 x* g6 _
    # @: O* L, D# ?# N) X7 X* P# Create tree object
    % \' Y- l2 b+ Q0 Y9 o4 x+ {4 o( smodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    1 B% z( ~! i+ n9 w  G& |; t- n3 v/ E2 }% _
    # model = tree.DecisionTreeRegressor() for regression) {+ E: \" g# P/ ~% A5 b
    ! q" k$ s7 N" M, O
    # Train the model using the training sets and check score. j+ {. B- m8 |
    model.fit(X, y)
    9 @1 `) A6 d; o/ vmodel.score(X, y)/ W: Z8 `9 Y5 I/ l9 T+ x: H) B6 c
    : ~/ A/ C% J  n) D/ I
    #Predict Output
    3 ]- p  m0 \0 [8 j( i. apredicted= model.predict(x_test)
    ( z1 H, I# E# k( O! c4. 支持向量机(SVM)
    ' b5 {& W2 o0 s8 w* Q8 S  @( M: u这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。+ ^2 q- e5 l8 H1 ^4 n& Q. _5 p
    ' Y+ F+ q7 K8 i% P& D4 V
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。$ w* L7 p! j) _! }% y
    % n1 r: c8 [: Q9 X# ?

    3 _/ r. [/ y) N! Z& u) X) `7 e7 Y5 D9 J* A
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    7 N, c- E8 e. C; w% O  M* E2 Q; @6 _( f. B: O
    #Import Library/ H. k8 p0 O- T; L
    from sklearn import svm
    - J# F4 N$ I( _5 j) I#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset/ s  [  s/ d0 a. N- P
    # Create SVM classification object , g5 e( f: ?4 e2 _

    ( }" f9 m, M% x  N- K( tmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.5 {5 y9 M/ `' K& c
    + v. v" E( j" z5 c: w. F
    # Train the model using the training sets and check score
    0 h4 s, E1 N" Y$ o1 F3 Imodel.fit(X, y)
    1 ^% s8 Z; r2 D. T8 U+ pmodel.score(X, y)
    # f6 D6 @, d- Q- u) ^- n$ C# I2 @
    9 Y8 }' s; F/ \  S) |! h$ c0 L2 X#Predict Output& r( p5 W7 l6 H% ?. R  f
    predicted= model.predict(x_test)
    * y. M  A3 C- B* S# p. }: O5. 朴素贝叶斯% g; E, T+ L% g$ l
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    7 y! @. P+ W  q! U+ A& C( B1 |
    8 }( r- K: b0 R6 Y4 X朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    - B! l: j* x& z  }  x8 r7 B9 T/ I7 F# c- L) u; t
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:! c$ C4 R: l- H5 ~7 y2 C3 C$ l

    ! C! A* T6 K8 t. v+ @' Q* ~6 c# Q0 m0 c# G" {( w
    P(c|x)是已知特征x而分类为c的后验概率。$ [  O( ]" g4 m+ a
    9 F. K" C6 x$ Y2 M
    P(c)是种类c的先验概率。0 X5 V& N3 L1 n- \+ o

    . H' T. N3 O& K# {, T. G8 mP(x|c)是种类c具有特征x的可能性。. i$ R) t: `3 m/ I% W5 Y9 S( r

    3 n9 h1 U% V& L# k4 z! a" ~) FP(x)是特征x的先验概率。. D9 J' e& m' g, O. }
    * N0 H% H$ M4 g1 V9 k
    3 b$ @$ V, _7 G# c$ C" i9 c/ \9 U
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:' y! O9 {! {5 d/ l- z
    . K& D( a9 \: |" ]# G
    步骤1:根据已知数据做频率表0 F. k' Z; B* W2 g

    & ^. U8 ?) l& Q/ ?- x& @8 W步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    , l. ]8 w! _; X+ I- [& I4 r
      g7 u/ H; o, H$ C1 _2 ?/ o* J+ ~3 D+ S& J0 ~
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。6 A" f$ ~3 T7 p: x! W3 v5 s3 m* ]/ S( r
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    + D+ N* ?+ b; Y4 K# F+ G% v$ l0 r+ o9 g1 D! ^3 s
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    7 u0 S+ ~6 e+ _1 s# P3 D5 M8 ]6 C0 y4 d/ n' i
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。+ I  W6 I- z7 o& U: y

      V3 F: ?9 }, E$ t6 n" z6 ~7 q那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。9 I# j7 E# d: n( u! m
    4 T0 b3 I% n5 c4 C/ z$ M
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。) p" o% j( z; L/ v- g
    4 J8 V1 z$ U& N
    #Import Library- q4 z" X1 H2 ^# V, W$ A  L% a
    from sklearn.naive_bayes import GaussianNB
    0 k6 r0 ~3 `1 l#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset" N7 y3 R* }; T* |" Y
    + K* X. n: c- w' N8 k( k. v) Y
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
      U+ v+ ]# h0 j
    3 Y5 v) W3 c5 ?0 `# Train the model using the training sets and check score
    0 t& W4 A. V" b) }' ymodel.fit(X, y)
    % R* C4 x4 `/ j0 B& N
    & `, f# \6 R! ?( j( W. y#Predict Output1 a& G+ B( Q& W5 R
    predicted= model.predict(x_test)4 s0 S6 L0 s8 s1 R( Q  e# `, A5 g
    6.KNN(K-邻近算法)+ v$ V& @7 m) R& N1 R3 Q
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。5 ]2 {1 ~9 _6 T$ M( q3 H" Z
    " B& }# t9 c. l7 }7 V* G
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。1 e/ V# ]+ v, ?% p' y

    ! n; U1 L  u; ~( r& s
    ! Q9 b3 }. F6 ]- z# x; I6 i
    ' V, t+ s/ p+ q; b; }! [0 o$ I3 mKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。  X7 p1 q- |3 y8 O5 P, m

    3 X/ q, z' O0 N4 X9 H在用KNN前你需要考虑到:
    * W+ h% @- f) F8 v
    5 l2 S! i' A4 F1 ^- j5 m2 M8 e$ ^KNN的计算成本很高
    & g* o, H+ a) N2 X: K" e  k  y. d5 T3 O9 ^3 P. Q  g0 t
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。* i* D& T$ w6 P4 Q- n) W, p* h* {
    & \( Z7 l  p. u2 f7 l1 M5 Z
    在进行KNN前预处理数据,例如去除异常值,噪音等。+ a5 Z& ?' d2 `
    9 v0 d) H0 v( [5 U0 n, H* m  R& o
    #Import Library+ K6 Q( H# w3 _2 {4 Q
    from sklearn.neighbors import KNeighborsClassifier2 V4 U. o4 I# a9 C# u

    & C* R9 {# U+ Y  W#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    8 T3 u2 ^& A' o' \; @/ q# Create KNeighbors classifier object model
    6 @% K. O$ P6 p
    2 f, q) {' i2 h. j7 n+ hKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    ) F; l9 E! L$ i5 K) p5 i9 b9 o* J& v# l6 e: b$ M
    # Train the model using the training sets and check score& D9 |" Y+ F7 }/ @1 g
    model.fit(X, y)
    2 c8 @( y" }$ T" R6 ^' f$ a$ _6 w7 D8 m5 I3 r
    #Predict Output% s' P% G  f5 E' u; V" z" M
    predicted= model.predict(x_test)* W/ ~* d6 k8 c; y% }  S, _
    7. K均值算法(K-Means)! W/ E) i9 r) Y* P1 w
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。9 F  {7 B' _2 p

      ^! A, d6 `7 D5 H6 O还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    ) U$ c% i8 F5 c) }) L& d5 P2 l3 K* e2 c/ `
    % i( b4 ~4 f& E  J7 H! s9 i
    K均值算法如何划分集群:
    ) o8 y# ?5 k! V" O5 y
    , O1 j& w" z" g5 N3 h0 q8 q* n" y6 r: @) Z9 N

      p6 a/ m9 j" ^' Q3 d# c从每个集群中选取K个数据点作为质心(centroids)。
    6 ]; U4 A3 u/ T+ W7 Z3 D" ?+ o6 [, R0 v0 ]/ J) {
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。/ }/ q7 y* _: l' w+ w2 O; ^1 N4 I9 B
    ; g! q- P) t) b5 E
    找出新集群的质心,这样就有了新的质心。
    . l9 W+ F) D5 y0 @. p" K
    ' L0 ?. ?8 f7 S, f1 s重复2和3,直到结果收敛,即不再有新的质心出现。+ d- U& s. Y6 I) X. k" N
    9 |. ]# Q* t5 Y% `! S/ G
    / O/ m) e9 T& v$ [3 a: h8 Q
    怎样确定K的值:
    2 s1 |  w0 g, e2 y
    : c, |9 n7 C: k3 M1 h& h" Q如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    5 h8 e! d9 p5 G! Q* i8 D
    ( e/ k6 v" n- R我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    7 t: t1 W) m+ A; i. z; X1 w# ~) i# J. S

    8 w8 r1 ~0 m* R% {5 {#Import Library
    ) C8 j4 T+ p9 z) r; A" ]from sklearn.cluster import KMeans
    . {8 ]( n/ o& ?2 w
    $ c, H. v* a3 ?2 w$ K2 G#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset6 Y4 {2 w. A% l* T8 W
    # Create KNeighbors classifier object model & u6 \8 I+ c- f% C% d4 I& Q* m
    k_means = KMeans(n_clusters=3, random_state=0)
      _0 E1 M' ^$ |, d/ e6 \
    , A/ ]# b+ Q4 n. y3 t& x  Y# Train the model using the training sets and check score. G  i8 O/ c8 s3 I
    model.fit(X)
    ' [! D7 A9 m0 R- R- k& \# A( O! D9 V5 j7 L$ F' z9 C7 v  D
    #Predict Output, ]( p& Y# b6 ]( X
    predicted= model.predict(x_test)3 T6 w( Q9 q. D% {* X
    8.随机森林3 Z0 }0 I* y9 c; i
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    3 r+ _2 I$ Y2 b# K1 `( F5 A
    ) g% a2 V  F  F- d! p* A怎样生成决策树:
    % P, g7 P- u/ X9 k1 V4 s' x
    $ r: \; c/ w+ F$ f& ^& R: }如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    # q( O; T' f3 K; R. E' Y% l
    ( B" A( D3 G4 S6 X如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    4 |* C( J' z4 o  d- L8 U3 {, P+ d& f$ P
    每个决策树都最大程度上进行分割,没有剪枝。
    8 B" B( B2 m" j7 ]0 G% ?  [
    0 r  B5 ?5 ^' H  N; [+ v#Import Library
      u% a/ m8 Y; q. vfrom sklearn.ensemble import RandomForestClassifier' q, \9 R. H: h3 }. N
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset' y# ]  ~7 h3 v- Y6 r3 y

    6 h% o5 @/ f! e- A# Create Random Forest object
    9 F7 {( x2 X& K% zmodel= RandomForestClassifier()
    ; q7 M( T2 ^- f1 y  c
      H7 `! J3 N6 A3 n2 A# Train the model using the training sets and check score
    * ]- ]  ~+ n2 ymodel.fit(X, y)
    8 A1 H9 z) q6 y* }7 e
    5 s' w2 C4 J( l% i8 [#Predict Output
      [$ X- L! o) j, upredicted= model.predict(x_test)
    8 X6 M! a5 ^$ b' K/ b9 {6 u9.降维算法(Dimensionality Reduction Algorithms)
    ; [3 j! u4 x. L9 K  }1 ?在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。7 c8 |3 h2 \; W

    ' U4 d! F0 u1 k& ~3 H" V" O/ \( j3 Z例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。# r* I( z8 a# a# p

    6 i6 `# f2 w3 z- H9 g- l9 d作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    4 t! T" D  O, K( w$ m# z8 z0 P9 x- T- B" V8 I! t$ F0 ~% S' x$ Z6 l) T4 q

    ' n7 {/ l5 v+ n# g! Z5 z  O6 X( K( F#Import Library# m6 U7 N3 u8 e/ r7 @  ^
    from sklearn import decomposition: I7 E0 c( N0 g2 |% K
    #Assumed you have training and test data set as train and test  q$ J# e1 ~+ `# m7 D$ m# G
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)" @& c7 j3 Z6 Z; z
    # For Factor analysis
    ) t, {+ {. Z. l5 m- g( [9 D. C8 j#fa= decomposition.FactorAnalysis()
    7 R8 S& |7 T+ g/ C# |% Q  [" k# Reduced the dimension of training dataset using PCA6 i# b5 t4 `6 ]" |

    * Y1 r7 U9 X( Dtrain_reduced = pca.fit_transform(train)6 ~% j: S- W, `" s$ B9 d% x8 q
    8 ]% ^; I; H* X! m1 e
    #Reduced the dimension of test dataset- ?# ]# j5 W& O6 ?# s
    test_reduced = pca.transform(test)3 b# y9 T* R& j4 L6 `' W2 a
    10.Gradient Boosing 和 AdaBoost
    9 V5 t3 p' x! t; ^GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。& T% f/ g% k4 h# f( m

    7 ]3 m. ]1 \7 C#Import Library! }! v( g% s# T7 b- d9 i
    from sklearn.ensemble import GradientBoostingClassifier
    3 L/ J2 c% x& e. D#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    3 f9 c3 m1 k. O; R# Create Gradient Boosting Classifier object
    $ S/ d3 K9 P! t" A& j/ r& ?model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    % r1 K" w1 W) b* E6 r, e/ k4 }3 }1 z
    # Train the model using the training sets and check score
    ( _: R& N) u2 s: ?model.fit(X, y)
    % g1 a9 ~" E9 D) \9 I& g/ X#Predict Output/ G7 W3 X4 ]. q& j- K; U7 g7 k- r
    predicted= model.predict(x_test)
    , Q1 g% R! R; ?- i: h0 {GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。) G9 ^! e# O# {4 u- ]$ T6 A! R) `
    4 o9 n" Z: X. t
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/511913865 f0 m- K) I, Y9 n5 s) m6 `
    ————————————————
    1 v, g9 ?4 i3 `0 k版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 G: n# E" f" K& _9 Q* o7 o
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075' v6 e( x0 y2 j6 D  p% P  @
    % [1 Z( I' W$ @& E* n
    2 \+ w1 ?" I- j) H
    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 08:50 , Processed in 0.459099 second(s), 51 queries .

    回顶部