QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2206|回复: 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
    4 ?7 k7 h; q/ m) ^7 y
    机器学习算法整理(内含代码)- O8 E7 A" I% h. Q+ @
    , o1 [9 U% _2 N& y* W1 `# P5 k$ n
    一般来说,机器学习有三种算法:
    5 S/ V' Y7 c. s. y6 @! \) [0 N
    ! G4 q* d) I) ~# K& Z6 }! d' S# J1.监督式学习! c' j) q9 {7 d5 M& M; R" R# _

    2 C; J+ E' U2 E: F1 `: [8 {$ t 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    ( `! E6 C9 @% F& q& ~, [7 {  }  q- }) Z  N& s% K5 o
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法% x6 {& Y( a% V8 i! W- Q
      M4 Q( F6 y. O- k$ d" i
    2.无监督式算法
    8 l5 d  n9 g6 J* ^; E* L7 J; Y5 N% G4 d/ ~0 u9 Z( v
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.' R+ Z7 n/ s# n: Q+ a, i0 A

    . |0 }, j5 H( N; U属于无监督式学习的算法有:关联规则,K-means聚类算法等. J" l7 y' B! o! @3 _3 {# ]. j

    0 g+ A1 u  Y& L: j0 _3.强化学习0 D2 g+ {+ j3 [9 g- f5 O

    ; c# \0 V/ T! W2 X  [" B6 R这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定5 i4 ^% S7 L# L0 k

    / s( w1 c9 J4 a: R# c& I& w8 K- Y# a属于强化学习的算法有:马尔可夫决策过程# u0 l' X0 W5 X" ~& P5 o: T: ~, n

    - Q% P8 [5 C' c8 v1 t- e常见的机器学习算法有:$ f) Z$ w: w) L7 h6 b4 Q0 q, r
    * B- q9 B# \( g$ Q
    4 d+ k) s9 n$ L3 v7 R
    1.线性回归 (Linear Regression)
    8 e: d' ]! _- b. v; I. ^! G
    0 Q8 V' Z/ c! p0 h, t8 l2.逻辑回归 (Logistic Regression)
    , ?5 Q' u5 a/ V5 I1 Z0 ]
    $ G4 h" ^5 V0 ]3.决策树 (Decision Tree)
    - M" R# k) {! r7 o1 }) k- ^0 D& o) ]7 G) H4 P6 i" N! O" C. r. Y
    4.支持向量机(SVM)
    - r& y3 |( ^8 J' Z  H. I3 T! w5 t) h; G
    5.朴素贝叶斯 (Naive Bayes)0 Q' T/ K3 Y2 u: g( H. \
    $ V7 ?4 E: E! ~. n/ T
    6.K邻近算法(KNN)
    ! Z& i/ s$ x# }: }  \6 Q- o' G$ Z4 X: _  n- j# ]
    7.K-均值算法(K-means): C7 s' @5 Y# f+ i5 W4 g/ \5 |

    $ T9 [2 Z* A/ I# b9 J# s  H8.随机森林 (Random Forest)
    3 s4 [. p5 M0 A4 G3 y' Q; B6 i/ e  Y6 h% M0 I
    9.降低维度算法(Dimensionality Reduction Algorithms)
    5 T+ S$ L7 h1 A! N3 f- ?+ a
    3 Z  Z! M% @7 b; s10.Gradient Boost和Adaboost算法7 D5 }9 `) E2 }' g+ c% g
    一个一个来说:
    : K# R4 k6 |, \8 f# i- L  T* l1.线性回归
    ; `  O& t) j5 J, o- b; N& c- P& }! b2 W! \3 T, [
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    # u* m2 o; B0 S. ]/ y
    ' y/ ]( U9 D$ n4 L: m( Q在这个Y=ax+b这个公式里:% @$ P( N$ ]) X, g! \" p

    7 s' Y  P) w4 q# o7 Z( u Y=因变量
    6 J) S% G  X7 B$ X8 i8 K7 h- e5 s! D; b
    a =斜率4 G0 ^) [; e! }2 a

    9 o3 C2 C' z( {; T  T  W% B+ J x=自变量
    3 q) \# o, J3 @
    9 h# k2 K2 u  u8 q4 H b=截距1 i" x/ x) M& v- e' J* A+ ^2 `* x
    : D, U$ I* ]7 m2 v7 P
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)) X% q, ^5 P. {
    ) ~! R) `+ c$ e) j, l* ~  ~( v& t
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。8 b+ J" c, v5 h8 S. O% h5 n$ r
    / i7 ~0 r1 z; B. x% J! ~2 X
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    6 Y3 |+ m, c% q& I
    1 l3 i: g1 g& ]7 U4 [- \2 x9 F
    ) \3 e' i2 @) Z3 y0 }# ?  [0 [+ \/ J2 m( I6 t, @% R  f
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    ' |8 q9 v8 J( D# `  S. D0 Q* H, e  [. |; V: F+ K' {8 _5 Z$ ]& [; a  `
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    0 z7 C& D" }2 A; U1 `) e* K/ c$ D% ^! o; Q9 k
    Import Library1 Q3 j: L9 E" [/ T
    from sklearn import linear_model
    % h) }* f. z9 s5 [& D8 A* R
    & @6 c. o8 d8 @8 ~- ?$ `x_train=input_variables_values_training_datasets
    ' |0 ~2 r" Q" H0 ^% g7 T. ~y_train=target_variables_values_training_datasets
    " q6 C5 @/ `+ y0 {! Rx_test=input_variables_values_test_datasets
    % u$ I$ d! m$ h& o" _
    9 b: I1 T5 k2 j# L) c/ u# Create linear regression object4 d4 y( q7 p7 l5 T: x# k+ c$ S( R
    linear = linear_model.LinearRegression()% G2 u5 q$ {* R- |# N
    9 D$ K6 }; I9 U- r- p
    # Train the model using the training sets and check score
    3 I. l9 _4 M) h: z6 k3 ^( Zlinear.fit(x_train, y_train)! U- e& I0 y* U0 ]/ z
    linear.score(x_train, y_train)
    5 x1 L3 `( ~! Y( J) ^
    $ i, `$ z: H; L( ]! R0 Y' Q#Equation coefficient and Intercept
    / V+ c# e" z- F# ~) j. D# K# l/ wprint('Coefficient: \n', linear.coef_)
    # D! r% N7 \7 y: q) wprint('Intercept: \n', linear.intercept_)
    ! |& N( h4 a- ?/ W4 E
    ( s& c) a! r7 X! ~" b/ G6 }#Predict Output0 d4 U& l: U: {0 J: V& V4 D# t
    predicted= linear.predict(x_test)9 w- S: x! Q5 Q2 r2 @7 K
    2.逻辑回归) e' t0 Z9 S" }
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!' t" b4 o  U& _, W" k

    : |! K  p# ]5 A+ ~: {" p同样用例子来理解:
      L8 f( ?9 f: n$ O% D; D9 G) t( m) S0 u: |
    8 Y+ v- Y  k, k$ p) B! r- C假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。. t4 z4 O8 l3 W6 ^; K" h" f% S

    / T, Q8 K" `" ^8 y. g/ A- a4 O数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    1 X6 ~8 p* ^) ^& B& D8 }' T  t$ Y" x* E1 w+ B6 I! g& ]6 E( p
    最终事件的预测变量的线性组合就是:
    ; _1 D2 K7 Y( `  E& X$ ?. v) \* x3 p+ }  e

    4 O$ s/ N  u8 s4 p; ~# r9 zodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence5 q  _1 B: d" b1 ^# n9 w& F

    ; j% x$ L: D. G0 m+ Nln(odds) = ln(p/(1-p))5 J: G  _' k0 |6 i5 k( n
    2 a  k& Z2 Y9 N4 {9 l
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    0 a1 E5 h4 u5 X! Y  E在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    ) X3 o$ i* Z* p" \7 ?  D; i6 c
    1 K. s6 [' p' c2 H至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    4 G8 x+ \( H: E6 R: K+ D- R+ j  N9 \. y( k3 s. _
    " I9 b/ [$ R4 L8 G: V% }3 D
    - \# H9 @! o% q) {' q+ g% b
    from sklearn.linear_model import LogisticRegression
    # ]0 ?; V. Y+ G& ^- M. z
    . M. E4 y* ?# l+ p2 f& o model = LogisticRegression()" X, T0 E9 @5 B, X6 `# t+ g
    5 P) b! I  ^2 c6 j7 b$ _
    # Train the model using the training sets and check score- b- @7 p( j$ r7 v/ Y
    model.fit(X, y)
    6 Y# ?" F' Y9 E. p4 c3 w model.score(X, y)' |. n$ [/ \- t4 {

    4 w4 y# \: m' j9 e: q) g, H* Y5 c #Equation coefficient and Intercept
    $ l  k7 W  h* b/ {( ?) P print('Coefficient: \n', model.coef_)2 y& M8 c9 ]! |% e0 y
    print('Intercept: \n', model.intercept_)- V5 U+ n2 h  D. ?" i1 E3 h2 I

    ; ]' T* g6 @+ [* B2 T) e7 c #Predict Output
    : a1 }7 G& ~+ W' m0 y9 o* X, i6 H predicted= model.predict(x_test)
    3 p9 m6 T% j: A$ J; B逻辑回归的优化:4 o% c/ F  M7 f1 B, M6 N3 ~) l8 {
    加入交互项7 a7 R8 C& b3 w, j1 K  m; Z

    ) q/ r3 p: S7 W& N  减少特征变量" s4 `# w3 U& o* c

    8 r. @0 U' h: D& D+ w' m  正则化
    : H7 V8 k3 d# Y( _
    / w; d  W( o7 V4 e! C  使用非线性模型2 j# n, s$ {! x6 m- B  N

    9 G% i- x0 p& F; w! m1 e3.决策树
    7 E: V9 ]. G+ h这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    * [5 i  H% o8 B8 K0 E. ?( V9 x( }& j7 V# j

    # A6 E4 X( b- t5 ]2 k1 N9 B5 ]+ ~: z2 u6 O/ q( o) {
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    2 }& g) g& m4 S4 y- X4 x, ]3 h4 }. S
    3 H  {  z" L6 `' l, u2 h, U( h: K, v8 N# |" v. J$ M2 s8 D
    from sklearn import tree1 Q" ]& {, w1 d" n

    + A  W& \/ u% b( S1 J7 w! _; o  |
    9 G2 _" y4 M; y" t' h) [" m# Create tree object
      t" A: R; m. D& i# _! bmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    ! w) ~6 N' N5 Z0 q! |+ t
    . r4 N+ M$ G$ N1 q+ b# model = tree.DecisionTreeRegressor() for regression/ B  V6 _, a( [+ D3 N
    & g8 c5 s% }! S
    # Train the model using the training sets and check score6 ~3 e$ j- e* q: R
    model.fit(X, y)
    ! G5 O$ o( X& i' ?model.score(X, y)2 a' g8 F/ A: L* V# ]# X

      q' k( _' n! Z#Predict Output
    : l- w  _0 E. b2 y" V7 K" {predicted= model.predict(x_test)3 S# `% }3 H* p: q
    4. 支持向量机(SVM)+ ~) \0 f& H" s, c3 @4 d& A
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。0 s' U# d  n' t% s6 B& g  u% D

    & a$ m' \( z8 L9 v0 ^现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    + o& ~: b* k( ~
    4 E+ L1 r4 R7 r# }! u% l# O
    * S4 C  l. K0 W# C. [6 ]* S5 V" r4 `. K  v  {  e: y, s6 v9 d# ~. U0 {6 @# G9 y
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。" }5 _7 Z) i" |% a' G

    , A* h; F( {0 y+ ?+ }5 P" Z" z#Import Library
    6 s$ {! L$ h2 `2 Zfrom sklearn import svm) K5 y' F* G4 R8 R) d
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    % M- x! O) b4 d6 G  H, f# Create SVM classification object
    - H4 Z: T% m( o, N; z# Z/ g' [
    5 S7 @$ _  t( a. i" d! Gmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    ) W( N5 W" i6 Y3 e) x: N2 K5 C- ]+ R& O8 p2 c  V, k
    # Train the model using the training sets and check score+ I9 g! e6 k3 F7 }$ u, G8 w9 _
    model.fit(X, y)# l- m" {( N; D& S
    model.score(X, y)
    # t. M7 Q' Z6 h) C) o4 q8 H" U7 s, t6 U( j  ]
    #Predict Output
    % o" Y$ @5 E9 p1 y9 R* _2 q* i' O2 |9 spredicted= model.predict(x_test). y1 ~- {% z% \! t
    5. 朴素贝叶斯
      V/ G0 O7 m: H这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    . w3 ^9 o- G6 J5 [
    + p* H7 g9 h1 g( {朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    : S& w: b; l1 G9 n$ V0 o/ n
    ' D* g+ D: U# e5 W! ]0 V贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    , C3 v. e! M$ C* }! }8 P/ b- ^8 @. H: j* \2 l

    4 t- B  |6 Q5 iP(c|x)是已知特征x而分类为c的后验概率。4 O/ ~5 v0 Y! `2 L: R8 D
    $ D# p% K5 C* Q
    P(c)是种类c的先验概率。" q4 `1 |* G. E& }/ M! j
    1 ]* \- ^# _" T
    P(x|c)是种类c具有特征x的可能性。
    6 ~1 U3 B8 l& T4 G  T8 M
    1 w9 G) q1 u# S" s0 f2 gP(x)是特征x的先验概率。
    : e/ i  q5 q* A) S7 S: [6 {# Z% [3 Q, T4 o
    * \0 c& J" a  X6 `
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:- P5 B0 ?# I! t1 E% a/ O5 ^0 w
    + \; K) j  z8 W
    步骤1:根据已知数据做频率表' m6 A% Y3 t# p

    $ ~5 v9 O3 Z- x0 D- D2 L9 w步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    0 p3 V/ j) j3 U* {$ S/ o7 S# q8 p0 W* B# l
    + ^- C  [9 b+ h; W" k
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。  c7 K! N2 Q+ ?+ j. j* w
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?' l: p) _/ ~1 i. @# ]
    * _3 `: q$ U' ]
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    - A( R$ |% n: [% i8 s. t: w* M
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    ( o, m4 U/ Z2 w. K# p5 ]! W7 V& i& O8 \* s, |, x! D% ?: g
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。. x/ _9 l+ h2 a# n
      X' ?% j& b) L1 k3 w& K
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    % p& n* o' p+ j
    5 K! K' Y; N$ f. F! Y" A& L#Import Library2 c8 |5 i4 n: X% X6 y/ x; ?; C
    from sklearn.naive_bayes import GaussianNB
    " V, C3 t7 v' L; f; g8 q4 _( T#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ) X- L) n# h6 s7 ]* P0 K
    . O  s8 X" f- O+ s# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link# o  m. S% w: [# S9 f  I7 c

    - b" Z5 ?# a2 u6 @# Train the model using the training sets and check score9 L3 z3 O! }% m" Z. w: y& e- P
    model.fit(X, y)
    ' R& ?' b; M4 {0 l! b+ m* ?4 N: H. B2 q6 b- a7 B
    #Predict Output7 _( G( G/ \* {. v0 j2 S- U! p. l
    predicted= model.predict(x_test)
    : ]! s' \, l) b# J2 U6.KNN(K-邻近算法), f8 y( ]; G8 @6 O* l* c; H
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。1 W$ @3 q2 F" Q4 o  \' K

    ; \. ~/ \8 d. i  I  [) k9 e& H距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    ; q. ?% n! t6 p! ^6 ?% W" e* V  z: o6 z7 U

    5 M* H' ^2 z, J  U7 Z: J+ |8 I3 p& t9 X+ A" ]7 ?: p! ^8 x0 J
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    : f8 V- D9 i+ s4 G* g2 V" S* N" f6 ]
    . T2 t- h( f8 V$ {在用KNN前你需要考虑到:2 V1 x% a9 f5 c) I, U$ l+ Y* r; H
    ( d/ J% a$ |& [# o4 d6 I5 t: `
    KNN的计算成本很高$ a) ~$ ^* M4 c7 J# O4 I

    9 x. F; L0 y- V( r( f! T所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。8 q4 m3 v- W9 [- `7 S
    ; P& W: t$ q! C& a6 S. I- o+ U
    在进行KNN前预处理数据,例如去除异常值,噪音等。- _6 H* T1 b2 E6 `( `8 E7 t
    $ l* p  X* c7 f) K# Z5 N
    #Import Library
    ! e4 ]/ I8 |+ O# ?from sklearn.neighbors import KNeighborsClassifier$ G  h( m! C# G) e% Y

    ! j! L0 r6 H) |: P#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset- q' v# O6 ]: B& z' P4 d* _4 K% l4 K
    # Create KNeighbors classifier object model " I% r. |' j. y2 E

    ( D, s) k0 f1 f% cKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    # A, ?9 P0 L+ e9 j' W) ~8 U: ]5 B9 q, E' K- _0 V
    # Train the model using the training sets and check score' D6 I0 n* d9 \
    model.fit(X, y)& A$ C( f4 P9 |3 m. M" Q
    4 [: i! C8 b0 j" B$ z
    #Predict Output
    1 \' O& n% s5 r, w1 _1 p+ B8 Epredicted= model.predict(x_test)- C, e- l5 g( l* L% n* `% n7 c
    7. K均值算法(K-Means); e& k# ^& g. T6 O* J
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。* I! K, G- [8 m. Q& q

    ' h2 B( P; ?+ D/ {) Q9 k还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    ; K0 y( r+ p$ K" t2 x+ f3 s( ^) a
    8 @9 H. E# w; K3 j! B" C, p; L  r/ G% K( H# F7 U4 V+ k
    K均值算法如何划分集群:
    5 F+ ?5 p1 @- _# i) r8 ~: A. m0 f( e6 @; K8 U
    0 l2 E  N! Y9 ^1 }& D/ a1 K, }
    ; s1 ~4 L! V& g6 s0 [
    从每个集群中选取K个数据点作为质心(centroids)。& t2 k# U" K: I) y) A! K) R" L: U$ P: m
    9 r: z% `) P' x
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。4 s! \7 l2 X4 M; B

    , Z# s2 k, v4 a找出新集群的质心,这样就有了新的质心。
    0 w8 ~6 v# P" o9 @% M' E- V5 B" ~: M: U$ v; F
    重复2和3,直到结果收敛,即不再有新的质心出现。
    : I: q2 l5 e. B& T! G
    1 A# I; T9 z7 u( \; U9 ]; N1 H2 Z! V0 r  A: ^
    怎样确定K的值:
    8 S/ s' k' C% C4 [5 D, ^4 ]& G
    # v" w: p1 {. X: c0 y如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    8 s5 \1 O2 Q+ J/ g% ^9 V. ^, Z% `4 d" E, J+ S+ F3 s9 u
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。- a! v, S. {6 X4 V6 j2 k8 B
    ! O  K: u8 U" U8 B$ A
    + E# t! c+ B. V. f
    #Import Library! U6 L. Q+ O0 X$ A/ k8 y8 x) y
    from sklearn.cluster import KMeans& b- ~& ~- H  L$ B8 o* x5 y

    ; k+ u1 l5 ~! `% {. R#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    2 E0 a" v( h+ F6 g# Create KNeighbors classifier object model " ~0 y$ C& c+ a# z6 t# I# x& I
    k_means = KMeans(n_clusters=3, random_state=0)* R; R8 [6 e8 _5 I" e* q5 c! f

    6 k4 B1 B3 r# j9 i* y+ N# Train the model using the training sets and check score" x( c. i& B0 C& j; s6 f' N
    model.fit(X)  E* ~& h- F+ |, ~- a

    3 j% h5 D% C: [5 p#Predict Output! n0 f/ ^2 w3 j
    predicted= model.predict(x_test)
    4 }2 ?' g4 {9 h& i0 R8.随机森林% p* T/ I0 S  B8 n5 H& P
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    ! U: Q( b+ n& y. C+ w: o, ?8 M
    / p/ e' f; W, Q; j- y+ ~怎样生成决策树:
    ; k  P5 e5 o" Q  g% \. e' H3 L' s  I8 B5 {# I
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    0 _, x8 ?  V+ V0 z5 E# J* @1 t% Y3 i8 ]$ Z( ?
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。& t& V" v2 @8 O# V  H8 x

    ' H( d0 l" {; o8 @* J! n每个决策树都最大程度上进行分割,没有剪枝。
    * H' V) k0 _: v, [9 V7 [
    . t4 O7 Y' C/ B3 v+ k5 N#Import Library" n: L# f% t* e
    from sklearn.ensemble import RandomForestClassifier2 y9 N: K9 P# ]9 j( P$ O1 d
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      }% Y2 `7 t- S; F1 B
    1 B8 Q6 G2 h+ y: T. C! |2 ~+ F# Create Random Forest object8 v1 i; \0 a% u9 `; g
    model= RandomForestClassifier(): C3 l5 K; \# h- Y* u1 h
    ; }7 V. r0 d: w* T# b
    # Train the model using the training sets and check score+ ]5 N$ d! ]2 @; W+ q8 l
    model.fit(X, y)) U5 O+ s/ {/ P' ~- h

    9 j6 a. N9 `8 }2 G/ C; c1 u#Predict Output9 J( f4 ^! u* Q8 S3 q  y
    predicted= model.predict(x_test)9 Z$ e  m( A; K; ~3 r$ R7 |
    9.降维算法(Dimensionality Reduction Algorithms). H- ?) H1 s% `, H1 j- A  _
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    + s+ E$ [: W; f3 m& @# ^8 o8 ]- x, C4 _3 b! v( V
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    % a3 D1 w) }8 N& Q0 S' m- H7 n1 [
    : H; A' v3 T8 w2 q作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。2 q% }1 g  M7 g. W4 d% e
    / {' J9 t% F& r0 D; ]3 p

    6 j- T  R5 U$ _$ p9 h- {#Import Library& @: [: O2 Y( |4 l. ~- Q4 T5 r/ Q
    from sklearn import decomposition" M. A3 \* p6 P" y
    #Assumed you have training and test data set as train and test) H0 Y) @1 [9 {
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)6 z# o: L4 E+ V  p. H
    # For Factor analysis
    1 P* i1 ?7 r- n- l#fa= decomposition.FactorAnalysis(); p, y/ P# _) J0 S, o! m- d
    # Reduced the dimension of training dataset using PCA
    ( C9 v0 F# Z8 L) _2 U; G2 i1 m  u- |& Z
    train_reduced = pca.fit_transform(train)5 G: U- r; l/ m) u
    * j  S% [* o; A6 P, q5 h; ]
    #Reduced the dimension of test dataset
    . Z2 r$ R+ D6 W! S, Ttest_reduced = pca.transform(test)" f* d* c) B* o. `$ ~$ }
    10.Gradient Boosing 和 AdaBoost
    * R- z& \  Z, P7 A+ LGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    2 q* H8 R7 n2 q+ X+ B- \6 O+ l! [, A  A" U' F/ G0 r- _$ V* P/ D
    #Import Library
    ) f1 c& B) ?% `% k2 r8 ofrom sklearn.ensemble import GradientBoostingClassifier
    8 Y' H! o: N. q9 q( T8 G#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    & Z9 L/ L: D, `1 ]7 X# Create Gradient Boosting Classifier object# Z4 t) x+ N& e7 h* z
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    1 p* R3 T6 G* ?8 u7 u- t) S. E
    # Train the model using the training sets and check score' Z# r# L# M" e. c9 ^4 w5 z' ]) ]8 x
    model.fit(X, y)
    ' l, [6 x/ f8 O#Predict Output- N- h8 @( o/ ?& A/ l6 `
    predicted= model.predict(x_test)
    ( M' V$ s" }# u2 j7 n- qGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。. o) @" o2 d# L# a
    8 R4 C2 g: }" F8 |+ G: u( _8 r
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ; v; b1 g: p/ u& t% {1 Q————————————————  s: [9 `" S# m& a2 |; Z
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # N$ z0 E' G$ j- T0 L6 v原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    5 A* x$ K$ B9 [) E& Q8 l- q8 q" X+ O5 }( R0 v' j) l0 t$ F
    0 i( o7 j5 p7 J
    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 14:31 , Processed in 0.401473 second(s), 51 queries .

    回顶部