QQ登录

只需要一步,快速开始

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

    " @' K( ?8 G# n8 M! w  T1 T机器学习算法整理(内含代码)
    # D. [9 u8 x6 o( m$ G
    8 q, r2 w5 @5 _& ^" b2 ]一般来说,机器学习有三种算法:5 v) {! i! ?/ k& \& Y: y* Q, {
    % K$ I/ O3 Q7 c& H: L( \9 v) F2 M
    1.监督式学习3 X- x( t8 n0 F& g1 W3 X* f

    ) }7 b$ ~8 ~6 Q6 m) D# s 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率4 m  J5 r' q' R* i
    . t( A  b1 c3 g) E
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法: y1 X& w" w3 j5 W; f, u
      y6 F" {( f1 O8 V
    2.无监督式算法
    ! ~/ z1 M& \" `# d/ {8 N' F4 V8 L+ ^; W0 g0 ?
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    9 b( T2 {  t  X! f" m
    3 I, Z. j9 Z5 |  L) d属于无监督式学习的算法有:关联规则,K-means聚类算法等' Z$ f' G/ n4 P

    & I  }3 d6 {! c3.强化学习5 M( w! m3 p/ O! ^

    , y# L3 T' C/ e' X这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定2 p& b; r; x, v0 o) j$ X, b

    + z) W- N( e/ j6 e) C, S6 c& C属于强化学习的算法有:马尔可夫决策过程
    , }3 a* n7 a! y" n0 k& Z- c0 U7 R6 r: M, J" l
    常见的机器学习算法有:
    . a3 @( {2 r1 X6 d6 X) N: w- b  b& Q5 K% k$ |5 a: m. T5 R  i
    % P9 t* Z$ l; j: G. J* p9 h; _$ A
    1.线性回归 (Linear Regression)
    . P5 W0 W4 M: t2 e4 h9 Y- Y4 [' l( ~9 ]- Y' m, _- A/ j9 f
    2.逻辑回归 (Logistic Regression)6 O9 X; N  p' }% h+ D; a1 L( S; m' z
    9 M. F& n1 ~: R. g+ A2 G6 W
    3.决策树 (Decision Tree)( O- d& O" X* Y6 i9 l2 u* o4 O

    ; G$ z! P2 E2 y; _1 O# x4.支持向量机(SVM)' d$ m/ ^6 R+ k/ r! T/ |
    2 T/ m9 N/ {2 O2 {" T% o3 a1 S
    5.朴素贝叶斯 (Naive Bayes)# B6 C5 ^0 Q  U8 h/ }6 o

    7 y+ x1 Q4 ?: [+ w6.K邻近算法(KNN), c0 J' M( y" q8 I6 \3 Z

    ! M; c3 `0 F, ]8 M& N6 Q- F7.K-均值算法(K-means); R' v: J# ^2 M' J& @9 }. `: J

    7 l) i7 Z, ^8 F1 {8.随机森林 (Random Forest)& T/ R. L  s* Q! j# f: V. m  q) X" h9 z
    $ s! n3 e( y& v+ `( e2 F) }% [" ]3 I
    9.降低维度算法(Dimensionality Reduction Algorithms)7 D" `+ R* b8 b! p" g' h

    " j5 B9 l5 j. ?+ a( P8 Y10.Gradient Boost和Adaboost算法
    0 x4 V6 G: d! W! y; T' A' u& F4 j一个一个来说:
    ' g) f* B" }% A- V" [4 E$ w1.线性回归
    # w* z% P# s# g: [7 s7 _  \9 r+ y$ i
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    6 W6 |* ^  {& y/ J; M8 D% N
    " X8 U) S8 O; C& z( ^( T; G在这个Y=ax+b这个公式里:
      c* H3 M. |/ P/ A4 W! k/ G1 \" s- w& K9 g. V! Q7 ]# R
    Y=因变量! y  t" X* F4 `3 L3 N+ Y. s& G
    . X; D. R! H- c* z1 R# I0 J
    a =斜率
    * k; y1 `0 p/ J# \( h$ A  Z% z- u" `% Z  v; k* T
    x=自变量& M, N& A4 j& e6 P) j) j! w% o
    ( a: [: R. h  W# K, L; _% l' U
    b=截距
    ' Z6 q- k4 E2 M3 K, Y9 _# ^  Z; N
    + }2 b$ q. C( D a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    9 }% D+ e+ h" X% [2 p2 l
    , d) a+ w& T% e' B我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    6 G1 G, I: d% \: W& d/ ]8 D$ X' `! ?+ W2 Q% J8 X
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.' }  h" Z# B* V$ Q
    ' m( f8 R& o0 |: |1 \
    4 ~5 {$ \# X% r* c/ F" @; v5 @
    # y8 `3 \" n! h$ J
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    4 V1 W+ N8 s5 f& x3 S, Y" n  u4 j$ L: y2 m) a- e/ k: O
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    9 D8 }. f+ [* i8 Y/ g: Q7 E
    - i; C9 v: k8 ?1 b/ OImport Library
    ; O1 L, V3 d) ^/ d6 ^from sklearn import linear_model
    : h8 ]0 ]. ^: \% h' }6 [+ C2 ?' \9 W1 N! R1 V
    x_train=input_variables_values_training_datasets
    4 e0 `& D3 a4 t* y+ Hy_train=target_variables_values_training_datasets! _# r' r+ o9 F
    x_test=input_variables_values_test_datasets
    3 V  L8 O$ T8 N9 c4 k' E# T# m- X/ O) i
    # Create linear regression object
    & b: s9 a8 x# h, E" G- Llinear = linear_model.LinearRegression()$ ]* h9 C5 y) h) O; s$ ?. [$ X
      @3 q1 M+ E$ @0 A1 `5 m
    # Train the model using the training sets and check score* s+ P# p! @/ n3 M% u6 x
    linear.fit(x_train, y_train)$ c1 X/ I6 Y# [9 ~* k6 |% }% \
    linear.score(x_train, y_train)- k/ c+ ^) u. z+ n

    ' |/ K* Q( x3 i#Equation coefficient and Intercept2 w* E& h$ L: U
    print('Coefficient: \n', linear.coef_)- h1 Z; \( S) ?
    print('Intercept: \n', linear.intercept_)
    ( D* Q! M) u. Q* J0 l5 J- w! l2 p$ T7 S: A+ z
    #Predict Output+ O) @% z/ u  z! W. {% o5 ^3 l
    predicted= linear.predict(x_test)" }5 }8 @2 @) T8 G
    2.逻辑回归/ W  ^8 p# Z- D+ Y2 N
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    . R! T5 K" H7 u4 e8 T& B0 s2 J4 ~) B( o# ?' A, k
    同样用例子来理解:
    * Z2 \7 G" _5 m5 }+ i2 ~: A  q. A# O/ t$ o# M% E: f: @0 P# [
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    ; p" C2 H$ b7 q# W- P4 W2 X% L7 |: A, c0 q
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    0 R% l  a# z6 e- N
    6 i2 F5 U. D' _0 |最终事件的预测变量的线性组合就是:
    0 ]- s! R3 k' b' C1 Q5 }" t" s; n4 P. k$ k0 F. a

    , ^1 W9 O4 }# |' f- Codds= p/ (1-p) = probability of event occurrence / probability of not event occurrence4 J0 q% O% }7 U( V' v2 _0 X

    $ k. q5 L; H5 }& M1 Y/ \3 [- kln(odds) = ln(p/(1-p))
    2 K% J1 Y/ s+ K+ {1 N) i; ]. E
    4 ^. p6 H7 l; S1 Zlogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk. N& Y  H5 c, X
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和." j( O6 T2 {* ~* b+ R7 T8 B
    4 q* U0 j7 z, [9 q+ m- ^! C
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    6 O9 L1 F$ P' p2 O% L* o
    $ a5 ]0 @" e) ^2 `) o6 D4 R) _5 h/ d* A# m+ e
    6 T5 Z& z$ v" e0 R: u
    from sklearn.linear_model import LogisticRegression
    ( G, x- X1 H6 h% H
    ) ]; W. C& |0 U& U  { model = LogisticRegression()& j, E* ^3 e7 ]" \. P5 B! m6 N
    3 Q) h  o$ i3 Q2 g- {3 ~
    # Train the model using the training sets and check score
    * G% ~+ V" X0 j model.fit(X, y)
    5 H5 z! _6 b( u/ Q! N" n model.score(X, y)3 W2 a6 t* u9 n9 w6 f: ?% X

    + Z- Q- k4 P# p+ V- w #Equation coefficient and Intercept0 X8 h. f, B1 @  s) b3 G8 t
    print('Coefficient: \n', model.coef_)+ c. ~8 S* q$ u% f# z
    print('Intercept: \n', model.intercept_)2 |' H% f: {( U! d0 f0 P. q4 k

    6 _2 Q. t7 I3 C; g2 j# | #Predict Output
    1 U0 R, t0 l& E  ~; g predicted= model.predict(x_test)
    # g7 q0 Y. O) K$ ^逻辑回归的优化:* F% M$ `7 n2 T. ?8 p+ M
    加入交互项
    " x  E- i2 w. I3 X9 K/ V7 u6 g) Z& x9 I  G+ X3 z
      减少特征变量! r- e" c1 `9 X: H/ R+ }: V0 a

    0 m4 l" r  D: [1 k  正则化4 a7 e$ s' V7 _7 i( x* i

    , l% V9 S+ y- w: c  使用非线性模型
    0 X' \5 v' w& h# p& `
    - d6 G9 M( k' \$ H3.决策树
    % ?. _8 V5 ^2 j这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ! c$ d, \3 c4 C. J7 L  R- Z) w0 B& z: N, I" |' v' m; L. i
    ! I* {) d6 Y# u& i' m; u& w5 G* i
    : r; x% A: J5 {5 h. s. ]; u1 x
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。2 a; f& D) F6 G& ~0 D
    . u2 p8 l0 o9 v& f# }/ j
    - N) O! n8 F8 W/ l* T# j) ~: J
    from sklearn import tree
    & G; u: G2 s, V6 u. @7 [2 |. }1 K0 T& E' l4 E
    : k, N" m! p+ w9 J' D$ h! _, X
    # Create tree object 7 h$ n& b# t2 F! y$ K% @
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    0 ^) l# t3 ?$ g% K! ]. U  b! M- b9 k3 m+ X5 M5 h1 C
    # model = tree.DecisionTreeRegressor() for regression
    : d8 K9 V1 ~7 b# h% [7 i5 }
    , m8 n- j8 y5 B( C4 f* S# Train the model using the training sets and check score9 q" u2 J) G' R6 s0 l
    model.fit(X, y)% A+ S* K- ]8 F6 z+ v# Z- O6 w
    model.score(X, y)" T0 f$ b9 N  {

    & U: o2 B0 o' c3 `4 y' I: ~& H#Predict Output
    7 v1 Y3 s! a* b! q4 ypredicted= model.predict(x_test)2 Z. z3 W% H0 R2 d, [
    4. 支持向量机(SVM)
    * ?" y* G$ p8 v# a/ M2 k- R4 R6 z. W这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    ; `% _& l& f2 }: p" Z2 S- Y
    ( s# S9 D' p9 T6 |现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    7 F; x# R1 j  O4 I! d% p4 s6 n/ i8 v3 H% b" B3 K5 p* L* I- G

    3 g0 n8 `; ^( M" C- X6 z& |( _) H8 l- D
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。5 O6 H9 c' a1 M: S) a, ^

    1 _2 y4 L  i' l2 P#Import Library
    $ s' y" I8 s4 a( Gfrom sklearn import svm
    4 F) N6 j' |' i#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ' R2 ?! y) L' |: {' B4 e- x2 [# Create SVM classification object
    ' _+ z# r: g8 K( ~2 \* t9 u: t$ H  z" e* }# o3 ^  c& e
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    " o+ Q' R# x. I8 R. @- ?( U9 r
    7 e$ R5 F+ x3 s) N# q# Train the model using the training sets and check score
    . h; \, @" {1 z( J* E  _% fmodel.fit(X, y)! [; O# L" q* b. P, A2 I# K; z# `
    model.score(X, y)
    ( s" T& i: P9 K2 T
    - N! A1 c3 k) H0 U+ s#Predict Output
    9 I, y6 R6 T: N8 T0 Lpredicted= model.predict(x_test)* U+ U# E/ @, e4 m, U; H
    5. 朴素贝叶斯, H5 d0 E# R% @9 D9 {3 Q
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    , L, Y* \2 e( ~* G/ y" P  ?) s! q) M% C$ V5 Z- D2 n# R  z
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    % S4 F8 j$ N0 |/ _
    * ]: L) Z* Z6 _4 r0 X贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:, o  I9 N4 v1 g5 c" _& U
    : T: ^4 f" t5 ^, F& S; O7 U
    6 V. |$ I7 M1 B- ]% S+ o
    P(c|x)是已知特征x而分类为c的后验概率。
    9 U$ ~5 D$ u" f: u* m& ]9 ?1 i% w: d. V* W% t
    P(c)是种类c的先验概率。
    9 X' s5 j; L4 B6 ]
    3 x9 D7 A" y4 D/ KP(x|c)是种类c具有特征x的可能性。
    ( w: m% a4 A) E) z0 s' x: x  g% l9 Y8 x7 X9 m
    P(x)是特征x的先验概率。
    4 _$ |- D. X2 g% _7 @8 P! E( G# ?$ r' _8 y5 V

    5 K! u; g! h3 @3 i' j1 F! G$ S, `例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    . y, S) n+ n: d( C, G8 R, B0 ]7 V  V* ~+ U
    步骤1:根据已知数据做频率表
    8 F; G3 n+ {6 y% }, Q  p9 S/ z. j' D" H/ T, v" I. d
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    2 Q, {- p+ ~, ?0 R; v: W9 h) G2 Y& e& P" K

    $ C  H4 ?) Q2 `9 r步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。! m* V4 ^9 ?! h* H$ N
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?/ V# @/ }% [! e

    $ ]. R5 t  Q7 a1 F# [2 y; W1 N! A我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。, X% o) z2 K' x3 F( k& f( U7 \

    1 ?$ `" o6 c7 H) A* a4 U/ ~这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    6 J8 _( L$ U% ^% H8 q. R
    , d$ r. q$ \  ^: Z! }2 N6 T那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    , q" c5 n: \4 ?  d
    6 l! n* w( a* C6 T3 t% M当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。+ W2 A: }: ]) v- l" T

    ' `: }$ L4 b, D4 T" c: w7 f6 G% d! B#Import Library
    0 o! E2 ~  ^" M* |  o6 j* nfrom sklearn.naive_bayes import GaussianNB5 h2 n( R5 v  k- J$ D. e& _4 C
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    " V0 r' d- r  ~
    # M- `8 i; M9 k" j4 j4 z" ^0 ^# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link  [; c+ u/ X: O8 D( P; V1 x5 U4 e

    ) P$ h5 m6 K) A6 t, H' `' X# Train the model using the training sets and check score
    : h& c8 }( n3 l! G5 w7 C! x) Hmodel.fit(X, y)* n8 l, D% h5 g$ y5 C6 z6 _
    1 z0 S, H6 @2 K3 X# T! {  }
    #Predict Output
    5 S2 F: Z: B, ~: o+ Ipredicted= model.predict(x_test)
    : j/ g# \* x1 n9 Y- o6.KNN(K-邻近算法)9 f- ^/ Y" J& V6 }* z1 H: o( k
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。4 Z# ?$ E" E9 g, a/ \% M

    * _' g2 y( L/ o% d! V距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    / E- _. _7 \+ a0 C' i. h# G; n1 N7 B# _

    7 v# B, `5 W3 u( n. D! J5 d. |/ ?$ ^5 K. L+ H+ n# V! X  U4 U9 @
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    % |2 T# V/ ?; q3 F8 O2 F; p! J  y) O; c; |" \& f. u# b  ^
    在用KNN前你需要考虑到:
    " d# o' g2 n% c# m7 X
    6 ~( T, l* H8 L0 H! g  [* ?' JKNN的计算成本很高( f: q/ A) O2 T9 p9 G6 C4 A

    1 u. \8 y" z4 \所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    . G. ?7 g& @% ]3 `2 ?2 d: R! k& ?$ h+ ^( P2 r+ }% N) x$ O
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    5 N- M1 M3 [6 d2 R6 m8 Q% R
    6 ~3 r8 p; p6 ^/ B/ ~4 Q. t#Import Library
    # G) C1 D4 \0 ^2 i5 yfrom sklearn.neighbors import KNeighborsClassifier) ]4 t% k, g6 A4 g) X5 g
    3 X. N1 B3 l4 ?0 R* ^
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset  p% Y/ F- y7 o+ A5 l) h
    # Create KNeighbors classifier object model 6 A2 A5 E3 o9 O' h; L2 r7 Y( K

    ; P. P% x6 M, |" M8 b: `0 ~& o1 VKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    # H7 D/ Y' j' d: c) M9 u& D/ z; ~" h, V* U: N, x: C
    # Train the model using the training sets and check score, p5 x3 M( Y/ l) b
    model.fit(X, y): x, W; D/ u) c
    " y: U: `5 A* r  Q- x  L
    #Predict Output% c) [6 e3 O( K3 x" B4 I  g8 y* @
    predicted= model.predict(x_test)$ [' h5 z1 R. D! [: {6 A, c( j
    7. K均值算法(K-Means)
    6 P0 }0 [3 N# ?" T+ v" c/ F) ?这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。- G3 W* R1 c7 ]+ ?5 K; C# p( R

    7 Y; E+ w0 o. [. I6 W2 e还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    " ]) a7 q. x* R$ H, U3 J- h3 p/ z- I4 @2 U0 T1 [; c- Q) d1 B% {

    8 \3 s8 w2 X+ c. o3 KK均值算法如何划分集群:
    3 F$ }  s9 {- W# a$ X
    8 D; r; R, J( b* v- v. q. I5 o3 U. F( f! Z  ]6 d
    5 @- Q) f0 E7 x, U  R
    从每个集群中选取K个数据点作为质心(centroids)。
    % F  k1 s  g# E6 x* e/ H
    2 K7 B! ?3 o$ C) ~+ e; l( ]- @将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。  m/ K6 ~1 v  M. b4 g) T3 `

    ) H' J0 ~9 c: A4 _# o找出新集群的质心,这样就有了新的质心。
    9 b" k9 F! X/ N# J7 W; u2 E2 m* E( J/ I2 e& \- D/ d- _9 |
    重复2和3,直到结果收敛,即不再有新的质心出现。6 S2 l4 m; E6 H# t7 X2 l) }
    4 J- G9 i6 y: ~9 O; \2 N

    - i% j1 S2 C6 b3 l: Y怎样确定K的值:8 h' R6 `$ V  ]3 Q# v
    4 i- J: v- K. L/ j) I6 e  W
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    $ M) ~3 l& P2 H+ ]6 `, d$ v+ I/ d, c: N' i; d+ u3 u! G; x# {3 J" h
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    ' o# w+ u, i9 V: I' k3 n3 c  a$ {0 e
    2 \% G; o( u6 e. F6 n
    #Import Library, V. N/ E/ g7 ~/ v1 u& s# R
    from sklearn.cluster import KMeans
    ( M; K9 i, l# G
    ' w4 \) g3 c- ~$ v4 r5 K& k2 h#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset) U, s6 G5 j6 v
    # Create KNeighbors classifier object model % T# t- C  V3 E8 o; h# F$ }$ E
    k_means = KMeans(n_clusters=3, random_state=0)
    * R7 `0 m" B) Q' {3 P' ~  h  W1 V0 A9 n
    # Train the model using the training sets and check score, ^5 x4 w7 ^4 @' ~0 V3 ~% n6 e; |
    model.fit(X)
    ( a1 a0 T: W2 e- e. m7 J
    ! P# L. ?4 e9 }/ d" s#Predict Output
    5 v6 ?$ l! [: ]+ E; Q  m# ~predicted= model.predict(x_test), q2 m* s: X2 S$ c# t
    8.随机森林/ c4 @: v$ {: Q" ?+ X1 a# V
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。) d) ^/ r7 \3 Y' C# j7 z9 M1 v, I

    $ ~; A& F  ?* o' A$ V怎样生成决策树:* E( M% {% e* u
    # F) l( S3 ?! i/ t
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。2 ~9 |# c5 f3 Z0 E( ^# u! H( n
    - x, |6 ]0 b( m3 s4 V" c
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。4 d9 _% G& g" l" y2 c- H
    7 J2 X4 X$ B: [9 Z" q9 @6 q
    每个决策树都最大程度上进行分割,没有剪枝。
    . n  Q6 \; y, r. l: Y  H
      Y9 v: |5 x6 P  C#Import Library8 a. n7 l: T! Q
    from sklearn.ensemble import RandomForestClassifier; X% b& U3 Y0 ~( }% E0 S
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset' ^' [1 N% }! O4 \2 M+ G

    3 p* C" @  `6 t/ C  b+ W3 W& C: T# Create Random Forest object" P3 o; Z  _; m) X
    model= RandomForestClassifier()
    4 Q- Q5 i1 U1 @" i% g% ~" g, H/ C" C! h8 Y
    # Train the model using the training sets and check score
    * n; C- O5 D& e  [: u/ omodel.fit(X, y)
    4 Y1 ?; o- @( B& A# Y7 \: ?0 @! d* }) H
    #Predict Output
    / n- y3 @; x  a* Y( o- Ipredicted= model.predict(x_test)
    & ?0 z3 T! J5 h1 R9 w7 B6 x9.降维算法(Dimensionality Reduction Algorithms)
    # G- l0 J' W! B% J8 A$ v在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    7 v$ V5 i) Q; G8 |+ b
    8 a$ G' ~# L! a2 G3 y0 ]7 h例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。( j- B+ u( t. L! h
    1 s+ ]  M6 G) Z1 b; D
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    # {, \# K2 l" R  E  r& l& P4 [- R- V5 `; }( i' b

    0 }/ a/ y% S* J; G#Import Library3 W) n3 |  s8 V7 y! e) @6 b
    from sklearn import decomposition
    : T3 X; }% `$ w#Assumed you have training and test data set as train and test1 Z: B' x4 l( }$ m$ Q
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)4 p- D( h: A+ `
    # For Factor analysis
    9 u0 i. f) e4 n0 ~/ t- |/ d#fa= decomposition.FactorAnalysis()# Q2 E" q3 Y9 r
    # Reduced the dimension of training dataset using PCA0 R3 ?# I5 k, @* ~5 ^
    1 ?% s$ d) f% C: Q( O
    train_reduced = pca.fit_transform(train): s7 {9 @% {6 b9 v  @8 S6 B
    - F; G0 y: S+ u
    #Reduced the dimension of test dataset% x3 i; _. M5 T) M- \2 q  k: W
    test_reduced = pca.transform(test)
    6 z2 d3 z) o. l; U" A& }: |) _10.Gradient Boosing 和 AdaBoost
    & O8 O3 C: A9 k% p/ JGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。; H; J% L& l5 \/ h6 q

    , s5 k  Q# q' `1 N' W$ e#Import Library
    2 {' }6 @/ R7 pfrom sklearn.ensemble import GradientBoostingClassifier
    $ J; i" ]  t1 ^* `6 ]#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    # w9 }+ ~) P1 A3 X# Create Gradient Boosting Classifier object* }' ]. T9 \6 P# k, a1 O
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)$ S$ z: I) b- k+ N

    ! w: ^4 d; |# F! D6 M# Train the model using the training sets and check score2 s1 Q1 T1 ~: n' g4 f  Q, v9 S# u1 R8 K
    model.fit(X, y)4 ^2 b$ y: t6 }* c! n
    #Predict Output
    ) Z; ?8 J# Y: ]6 Y. Qpredicted= model.predict(x_test)" `  Z  m1 p2 t0 i) v+ o0 f
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    ) j" \$ y/ g  L( B- l3 O$ r1 q, }+ Z1 I) R, P8 a
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ; l3 @- q/ F8 u+ b( i- z————————————————
    * R$ T3 c0 j% _4 p7 H* [4 D, a! a1 }版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " o' x+ z: a  O: U! ^; E2 M/ |原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075+ X, ^; Q3 `$ \' z. Q5 |! d
    2 E, I9 Y9 k% G' J2 O

    , J& v5 V% K! V* \
    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 15:12 , Processed in 0.445508 second(s), 51 queries .

    回顶部