QQ登录

只需要一步,快速开始

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

    ' O! |7 w  B- h, A* z8 a机器学习算法整理(内含代码)
    4 G6 h/ r! ?% T5 n3 x) v# ~& ]9 Y) m' z( E: w0 Y
    一般来说,机器学习有三种算法:
    6 Q, s4 [) \6 i! K& a# ]7 V$ q' |# x
    1.监督式学习
    ! s! _  @3 R8 c; F* m& Q2 ?& C7 v+ V# r' c' ~
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    ' D# T$ I& L) k
    6 o  W8 o" `9 W3 B) }4 ^: u) G属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    % O$ n7 b; E) V1 T
    " n- D, `6 F+ C& h5 O" }* |2.无监督式算法
    6 Z+ ~& _  b4 @! _" t
    5 V: K+ p1 Q+ J) Y无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    ; K2 Y/ U. H7 L! X7 H2 P7 h) [, c+ M- v% W2 o! T7 `
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    2 l; w! }* x9 N% m8 N0 o& h! E% N. L; v
    3.强化学习
    0 n9 b+ U5 L4 R. u  b0 v) z2 Q8 t# e& B5 e7 P% Y# ^3 ^+ q4 r
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定8 h& `  m; r# ?3 O6 ~  f% @
    0 o2 w; D; v- v7 m; j
    属于强化学习的算法有:马尔可夫决策过程7 c' Z: T2 `. Z  u8 c* u
    " a, W$ V  Z& h. T, T
    常见的机器学习算法有:
    . l9 Q4 T' I# F9 N: P
    ) n9 }* n# }! y- q  T
    ( ?6 U: I" e; O9 k1.线性回归 (Linear Regression); G6 \  J8 }, c3 D

    9 O* z: u& ?8 O+ N2.逻辑回归 (Logistic Regression)
    6 ?5 ~/ D% D- ~! R2 c0 U7 @+ j6 A9 C3 a1 c- H" r( l
    3.决策树 (Decision Tree)6 \7 x9 L- u. b* v* {# M: t1 j
    - y, T' X" x; r: o* m0 a# b& x
    4.支持向量机(SVM)* K! X& R: `8 {& f

    - D; ]! h' {: v; H5.朴素贝叶斯 (Naive Bayes): E) J; d8 R* `  \9 r/ D
    1 g5 z& n$ I4 ^6 |& D
    6.K邻近算法(KNN)9 M: o" O7 l# J/ X

    & V% Q; `) X* |6 n; I7 k2 x9 p7.K-均值算法(K-means)
    5 [+ z% }! H- G0 d4 s) R8 v  H1 m4 J7 X  g& H0 U
    8.随机森林 (Random Forest)1 |8 W  E& \! U9 Y

    ' N  I7 g# O5 L7 n9.降低维度算法(Dimensionality Reduction Algorithms)
    ; j4 n) i" U# A8 |
    1 p4 W4 ^3 |% H10.Gradient Boost和Adaboost算法' X2 u4 u% ?" v( `4 H8 D1 `4 [, S$ T) d
    一个一个来说:
    ! j$ t9 ?. @9 D. V% r' c1.线性回归- t0 s, J: Y% B# _; ?# L/ {
    ( @# ]) Z  D; s" M5 d
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示./ g/ U* M1 Y: ~2 O6 T

    / i' u& C* l& ~6 T8 t6 n在这个Y=ax+b这个公式里:- T2 T& P' T* Q
    + ^, ?* r  s4 c3 |5 Q7 j) q
    Y=因变量" t" y8 {$ L2 x( q$ O& e4 j) O, S
    2 w& k' J0 q2 z* m- X9 K9 l
    a =斜率; l0 o) t" M( C7 H
    , j4 }" r0 L0 f. a
    x=自变量1 m& K, Z- k( t) `& F
    * l7 c% b% f2 q9 R8 i
    b=截距
    # S8 n6 d7 w) f, c3 s& r* X7 p" I
    . U6 t8 `( I3 Y4 F" ~ a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    0 w( i: f, ]- }! k2 h6 i" s
    * S4 D1 r0 ?9 C& K3 v' m1 O, P我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    4 e" T7 T, p2 G: j$ _: k+ k+ A/ E% k: {* M6 D$ _
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.9 M4 |0 T5 s7 H. {8 b. x5 y6 @

    5 g' x/ X& L' ?: t$ ]6 F# a* P5 t- t' D

    / s/ S* G! ^- `4 c* B3 p! p线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
      Z4 k- B8 h; }  Y; U7 ?( `$ Q' M9 Q# n9 M( g
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归" Y9 u( V" v! c4 U! {+ }" a
    $ A1 h. ?* n0 e- b" n
    Import Library; q5 K5 Y5 ?+ h% q
    from sklearn import linear_model
      @1 p" |3 ?. ~' [& }, j2 j
    ! |6 z9 ~6 Y5 j7 s1 x1 O( qx_train=input_variables_values_training_datasets
    ! J/ q; \& R+ a+ u4 A  [, iy_train=target_variables_values_training_datasets5 C5 B2 J( l# @9 O; ]2 Q
    x_test=input_variables_values_test_datasets
      ?/ _. M' M" p6 e: ~
    + I: c: M2 f' }( Y% Z# Create linear regression object
    " O8 T$ Y* _  B& Q3 ~linear = linear_model.LinearRegression()
    5 ?1 `% Z5 M6 j; A2 e  T) M
    4 x4 x8 x8 _' T! i, Z& l) |, h% {# Train the model using the training sets and check score
    6 c- {$ e# X$ E1 m6 [linear.fit(x_train, y_train)
    3 s3 e& q: d' P% u. Slinear.score(x_train, y_train)+ A( y1 }; p! V9 ~8 @) |
    & t* ^# h4 K" b: @6 Y
    #Equation coefficient and Intercept* [. c+ \* q0 |  Z( z( Q- g8 ~# }8 m
    print('Coefficient: \n', linear.coef_)( D- A2 j6 P* Y
    print('Intercept: \n', linear.intercept_)
    * I: {$ P! y+ d8 R1 b% R: n* ~: V/ t
    # l# k, i. a& c+ H8 |#Predict Output; l5 o6 w& {0 r/ U8 z8 b  d
    predicted= linear.predict(x_test)
    & x8 i$ N* X( z* l2 y6 d2.逻辑回归
    8 N: X& x& O5 }9 F  b- [: v逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!* O8 N1 \* `- s! l* K1 {6 P( C$ T# D

    ' v/ k7 e( Q# a: P同样用例子来理解:
    / B4 E7 W# f8 ^1 c7 g
    1 L, ^. C" p) {. f) \1 B  w假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。" y! J$ f. L# l; H+ i
    1 A! I0 x- Q8 L& z+ j: n, k% }+ H& a
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧8 E$ ^9 _! N# N$ ^
    ! v& l) R! R2 p* o
    最终事件的预测变量的线性组合就是:
    ! F. W5 P2 v8 Y6 G& z( Z/ ~- i" P+ d5 u& X  r) _9 A/ h4 {: \! \

    - X4 t$ f9 X8 B1 g1 T$ Z9 z  Yodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    0 b6 b$ R: m" W
    - M/ Q! N9 H- Mln(odds) = ln(p/(1-p))
    3 s8 m/ V3 X$ @5 z. }: S
    + [% u( C% B8 b0 h8 g, B. llogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    ! R3 t7 t( M1 u! _/ C( `+ I5 j在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.! d/ y1 w( b8 {- O- x3 E
    2 w; S) O$ R5 N4 n
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.6 r1 F, r4 M7 ]; @  k

    1 U1 y& N! ]1 G& I  N* f# `# j, D5 b  N! |

    # ?4 J  @- i: Z, w& k from sklearn.linear_model import LogisticRegression4 `1 V; A2 N  j) w
    1 o9 [7 d2 M( i
    model = LogisticRegression()
    - d& J! e7 p1 Z% C( f4 a  K8 K' l' u
    # Train the model using the training sets and check score
    7 h, k) N$ M% ]! Q4 [8 F# x7 N4 d model.fit(X, y)
    4 n) C( j; ~+ R: j% g  \ model.score(X, y)# m. }" x/ a) b* P1 _0 r
    4 a5 n/ ~+ K3 }) u
    #Equation coefficient and Intercept
    " I! m0 D! r& w( _8 i( h, d/ q print('Coefficient: \n', model.coef_)
    - f4 F* c! Y/ w" n. o0 P print('Intercept: \n', model.intercept_)- T2 `. c7 m8 i# c( k" H7 Q7 B
    + K: `0 U0 c- `9 C7 v, w/ z/ F0 z
    #Predict Output
    3 c  k# L4 X& G# Z7 m- c9 L1 @1 L4 @ predicted= model.predict(x_test)1 R& v/ B4 v: I/ H, v4 Y# m/ Q
    逻辑回归的优化:; ~: |# v+ I# E* G" ~
    加入交互项
    ; Q6 p  d* y6 E# y7 v0 i
    / ?% t* h' Y7 O$ i) i( i0 c% t) x  减少特征变量
    - E; @! i+ C) U" ~6 @5 }- B; U4 m" d8 p* C% `+ t
      正则化
    , h3 Y+ ~1 B5 B1 {$ D3 c( E
    0 o" @' c7 s2 l+ X  使用非线性模型9 Y- Q5 o' N2 ]& a! h9 a

    6 [" p# P9 R/ c$ l1 J3.决策树9 [# ^) ?8 Q* V' o6 u" O  e; D
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    & ~6 O" ]( L! }" P8 N" ?& Z/ ~" C8 \1 B' G& k$ M
    $ @& Z6 w6 Y" D% H
    + g3 c0 j5 P' E* f
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。5 B) |* A- I: Y/ o
    5 d* i' P% ]/ C9 C9 c
    + }* z" d7 K& O* ?% M
    from sklearn import tree  T9 m8 B% a- ~1 {$ ~+ `) }
    - v9 \0 L$ O- r  p( G  E
    5 s5 ~1 g2 d0 J4 |) Q; g0 ?+ ?
    # Create tree object
    . k  g& P  N* O: Bmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  , q, v6 Z, E) c9 x+ B

      l+ E/ L8 ?3 C2 T4 c0 B6 h, s# model = tree.DecisionTreeRegressor() for regression. |$ P) v/ i- a8 z3 u) Y- ?

    - y1 R/ U) Q, ^/ q# H/ ~# Train the model using the training sets and check score
    0 g! I0 q! `: D7 Imodel.fit(X, y)/ k8 h: a! ^0 A( a: C) t
    model.score(X, y)  [: M, ]8 T: c. f2 ~

    3 J2 [, Q+ e0 \+ u#Predict Output
    ) k( K3 `" ]9 F% R: Q: Vpredicted= model.predict(x_test)
    4 G" c8 M7 N# [& q0 m' {8 i4. 支持向量机(SVM)
    . {5 [# M8 v% Y' C# @( r& ?这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。* ]) X: t1 x$ ^5 W

    " s+ e& f* z- q$ J) f3 B4 |" j现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。- A% C' e9 U" s, ^4 g1 g* U2 M

    8 p9 L5 v: }1 C$ M- `
    ; P" p7 t* v. s7 t' u2 r' t( e' t' G& [1 L( `
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。# ^$ Y. G! F( s: [) F4 j

    & `& q* ]& f3 ~: J5 ]2 W3 i#Import Library5 u! h& Z( |! S6 g: H9 q) h" J* t
    from sklearn import svm
    ) p& |4 n1 {# J% l0 p#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : W2 n0 t/ |8 H! f# Create SVM classification object ) x+ e/ B4 D$ ~, ?

    9 G* o# o& O) u8 l9 c' _& bmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    ) }/ d  L! N- _! L5 D: q1 P' ]
    + C% E3 _( J2 D" ~% x  j# Train the model using the training sets and check score
    " F' z7 S8 E% @- kmodel.fit(X, y)
    0 c0 ^+ t/ Q' \9 i! S2 ?8 dmodel.score(X, y)
      j$ M7 o' X7 y- y, L9 {7 g/ e& b. M1 w! y) _
    #Predict Output4 O( Y: S: T, a$ {+ P+ l; @
    predicted= model.predict(x_test)% f+ W% ]% q  R' L. q8 K2 b
    5. 朴素贝叶斯
    - l0 s& G  h) W+ h) Q5 V这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。$ H2 f8 O1 r- W& d& o% s

    7 F7 ^1 m' |; D- t3 h5 n' I5 C  F朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    5 Z2 Q! |  e$ i" R: S/ c$ x9 O) {+ M; Y/ ?% n! k5 m
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:. n# X$ t2 d& h3 d8 _! D7 |
    / t+ E, ~& J" y! N0 f4 l2 D

    , o% @. F& N) r! B* G- k6 h6 pP(c|x)是已知特征x而分类为c的后验概率。
    1 E$ D1 g5 E2 ]0 H! P$ t
    & S( u+ W1 d9 \7 jP(c)是种类c的先验概率。
    $ k3 g0 u+ n; ]7 k) B/ M1 N, ^( X
    % o' {- k( k3 ~6 XP(x|c)是种类c具有特征x的可能性。, I1 @/ e3 `6 C7 c: Y

    ; [. g2 T+ J7 `/ ?0 |/ }, vP(x)是特征x的先验概率。8 n4 A  D: Z& Z/ A5 f$ Y
    1 O  L/ j5 A, {

    " \+ @3 G5 }/ w/ i9 J9 D例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    / t# u% b/ k" g- ?$ o
    9 c8 C. f  }* r4 A, [, m步骤1:根据已知数据做频率表
    . s6 p* {) y& U/ V! @& k: T' a+ d% j8 `+ l: J" ^8 A
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.$ N  Y) Z. J* @& H6 k4 a# w1 R

    ) C, V# I% U- G% n$ y9 H7 ^0 M9 W- }2 p- w7 r
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。9 L1 O0 B- o3 D& c; o% @. M
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?+ P' \6 T2 k! k: o3 f6 L

    1 ^4 S* K+ N' g" n& u我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    # W( s' @* T9 i+ D. D, ?/ [
    & P& S/ a) `1 C8 h) }这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    % B' M9 [! |# ]: I5 _0 b5 N
    6 ]- D; M- ^' \0 |3 K: l$ R" s6 |: H那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    ' i# j2 k3 `! F4 I* Y( `' \6 Z
    5 \; S0 h* ~4 Q* ~9 M  p当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    - c7 }# y4 i( l+ P% ~$ ^6 u5 p2 I- g; a4 Z1 _: W0 [! ]2 z5 g# f
    #Import Library" k' _8 d, j5 p6 C4 {5 q, t4 @( r) W8 G
    from sklearn.naive_bayes import GaussianNB
    5 e2 f2 w& i7 v# h6 M#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    6 K+ A, ~, e$ `  r
    $ B) y2 [) {; W0 ?( y) [& E# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    " `- [7 C" p2 C, B& s
    6 A! ^2 x" i5 j8 X0 E# Train the model using the training sets and check score/ `$ H2 m4 K! p
    model.fit(X, y)
    : V8 Z$ g0 F- |- }$ z
    9 ]! k6 ]# Y8 E- R4 i* u- I#Predict Output* k/ \! N9 r# m+ t  T8 c
    predicted= model.predict(x_test)3 e# i% n1 Z4 B& u. ~; p
    6.KNN(K-邻近算法)
    / b! U1 J( a: A' {9 X4 K这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。& s5 E2 i0 Q9 H: |# @. @. [% z. C

    7 q+ A2 M( S% n. ^4 b5 u! A+ F距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    ) m" \. S4 [' m  Z- X- e% o) U& R, i
    . V; r$ n! h+ m1 E' W1 V: t" n
      j' T& N7 g0 _% O; y0 k
    9 H# I, F1 J4 ]6 H4 H/ L9 IKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。. T! `5 c# r+ K/ i+ r7 N+ y
    . w, i7 F6 d6 {; q
    在用KNN前你需要考虑到:
    ( @" O( z! D. m  z1 M1 V/ ]4 D+ C" V3 e% \; n  M
    KNN的计算成本很高( v7 F% ]; {+ c; ^( \/ F

    ( X" C7 }/ B5 F  s9 h, d9 L所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
      U/ M( t( M' G, u
    . h3 G. `( X4 r* `# y% b: X在进行KNN前预处理数据,例如去除异常值,噪音等。
    . g3 }6 A* \, J
    # \4 Y& i' z! {6 f- y#Import Library
    0 E( G, n, n  f+ kfrom sklearn.neighbors import KNeighborsClassifier6 e" ~2 F5 ], Y% ~4 y- ?! P

    ; X, t) `9 ]- ^4 f$ x: A* y) f#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset$ j6 o1 P4 n. c4 w3 F1 [
    # Create KNeighbors classifier object model . q* L' `) h0 M  C/ L( M9 h9 {+ [
    ! b* C0 b5 S" q. i0 i2 {
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
      b4 T, x6 ^5 h+ n6 {) J  \  C, W8 r  E) ^& {; ]
    # Train the model using the training sets and check score
    % k1 @5 _& n7 x5 Imodel.fit(X, y)
    . u5 B7 a: d' ?' L7 o5 C+ k, M- X- t7 j6 q
    #Predict Output( ?8 d4 R' M* q" k
    predicted= model.predict(x_test)
    $ P+ E  a5 C+ S6 F+ x. U7. K均值算法(K-Means)
    # _) U  @3 ]8 I) ?. k# v: n: u# s这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。3 E, J! g" B, q& P6 c* |1 U" H* j

    / E7 P; `# f# Q" E还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!; G1 c8 a. E) i7 d% h8 ~2 Y; j6 [
    ; a6 r/ S( _9 H; s: e0 b5 }; k

    0 b7 w0 W* e& O1 o" DK均值算法如何划分集群:; x, }7 a) v0 q6 C% X( N
    $ J' p$ t* f8 B  e- l) ~) h

    . m5 {3 y: j1 C3 F
    " [. O4 Q3 \1 V# K/ `* \从每个集群中选取K个数据点作为质心(centroids)。! o2 t% Z0 z6 d! y2 K5 A

    7 S/ j" n' Z, Z4 k将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。+ A9 o& W3 I4 J. ?

    8 F4 D6 L% `; m1 d! {找出新集群的质心,这样就有了新的质心。
    % Z2 L4 a  J% Y: i; v3 y+ y+ y/ v& S$ g* f8 J4 }9 @) K( i2 K4 i
    重复2和3,直到结果收敛,即不再有新的质心出现。
    . _: B) e$ [, H
    : Y* |! i+ X% U6 c) p  m
    / x$ ]0 F3 G, ~: C8 L7 @怎样确定K的值:  i5 w6 A& V6 i$ ^6 R
    . V  w. m% i, Q& A# e' }
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。: O2 S8 B; O3 _, f
    5 |$ E- W  @; b) B
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。6 N- X! |( V% k0 u  |

    , W9 u8 m8 G# S. o; u9 d
    $ l8 `- f% i- `0 L6 Y/ Z9 a#Import Library
      f8 j5 K- L2 Z3 zfrom sklearn.cluster import KMeans7 E6 x4 B) i5 j; r! v3 j! w* F
    $ @1 h* r" t+ _. M
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset* {; j1 J& X! z4 ]; |/ ^" }( X! d
    # Create KNeighbors classifier object model
    - X2 B: \% L$ u9 D6 ]  s2 Q* Kk_means = KMeans(n_clusters=3, random_state=0)
    1 q0 d* h% s% c+ j5 M$ `2 a" {2 J; {  i( h
    # Train the model using the training sets and check score4 x4 x$ K5 A4 D% A; r
    model.fit(X)
    0 |; a7 _1 c6 m% N) Q
    6 {0 x7 d1 [+ {/ t#Predict Output3 C0 s3 h4 I0 J# v# ^
    predicted= model.predict(x_test)- Q4 S1 l4 P2 G$ o  _; [
    8.随机森林
    * w( j5 a  [) S$ w+ _) J随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。' E$ s3 o: I7 ?8 V" ?# Z" W9 i
      A$ P6 n3 w4 H/ W, _+ a6 [
    怎样生成决策树:
      n3 B7 ?+ _; ~6 a4 ]. v
    4 ]- W5 g3 _2 D1 \3 O如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    3 |0 r$ e4 x& m
    2 L4 q( i. z' B8 b& k/ Z, u. e" e+ C如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    : T0 f# k  V% k- R2 V: D( @& t7 ?. [# k& }6 h
    每个决策树都最大程度上进行分割,没有剪枝。8 B' x) F' E# f, ~  m0 q
    9 y4 |+ n7 R- a3 d: K6 m+ r: m5 t% y% Y
    #Import Library* Q6 L: v9 G0 V# b  {3 a% H
    from sklearn.ensemble import RandomForestClassifier8 S) Q* d$ q& c# _2 \6 I
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    1 `" _* H' V* I
    + [+ S# e4 {, L7 Q4 L# i  o! k# Create Random Forest object$ @& y' s6 e' O$ W) e  s
    model= RandomForestClassifier()- v4 u9 w( U0 S7 V2 k

    0 c  p0 f5 ~1 u2 y# Train the model using the training sets and check score
    4 }+ E1 R0 g; ^5 J, F% t; Qmodel.fit(X, y)
    ; k2 U7 D- h; k8 g8 F
    7 z0 Z# W2 N) G; g. B  O9 F: x#Predict Output
    ' S) F( g4 G4 h5 P/ {* zpredicted= model.predict(x_test)
    ' z( }1 O5 S, M: ^) ~) g9.降维算法(Dimensionality Reduction Algorithms)9 i3 ?1 |; s0 A" r
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。  O- L# Y1 {7 {# @6 ?3 B

    5 q; x/ ~& q) z2 X3 s/ A例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。' x" q) H' C' I& g/ ^$ M
    / \8 j" q' @* Y5 w
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    8 ?! b& \* M7 i  J! U6 ?0 x
    / @, W$ }3 B' J5 T" y
    1 [- I3 G% h+ v- N$ `& g( N2 ?8 d#Import Library
      S0 D2 y, A; c0 [: jfrom sklearn import decomposition
    * L" \9 X0 A0 W2 p  F9 g- k" d#Assumed you have training and test data set as train and test
    3 ^9 r* [: l/ ~& a* N* ~2 B# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    9 T  W% v# _, r) n! ?# For Factor analysis# S( ]  T. P) l3 u+ m! }
    #fa= decomposition.FactorAnalysis()
    1 h+ h9 B: G% R% W' x- e3 F# Reduced the dimension of training dataset using PCA
    . k: V: S9 I$ G* Y
    6 E, x2 \. P4 f4 G$ strain_reduced = pca.fit_transform(train)
    - k( G4 ~* R; ?2 ]$ f1 Z1 n- Y! |" D: q" g# m" C( y
    #Reduced the dimension of test dataset, i: a6 M1 z; d3 k: H- g
    test_reduced = pca.transform(test)
    . I+ x1 Y: p! Y# K( T1 v10.Gradient Boosing 和 AdaBoost# H$ a+ Z. S% |6 F* s+ e! L7 Z
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    . X4 z; ], s( s# I5 {) T) v2 ]8 R/ i) g# ^8 Y7 b- ]* }
    #Import Library
    ; B$ O+ }2 p+ N7 |, ffrom sklearn.ensemble import GradientBoostingClassifier. _& K9 s% b7 {+ ]" d
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset& [7 Y( n! T/ n" z3 r1 A
    # Create Gradient Boosting Classifier object
    6 O$ @# q: ?& `model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)/ U( _  s6 K5 P. m- {0 V. i) {

    # d+ L, T, z. ?  x# Train the model using the training sets and check score
    ' }4 z7 r9 a/ X7 T5 \0 p" ^* jmodel.fit(X, y)
    4 h+ v8 o2 e- A6 D' v2 P, A#Predict Output$ [2 \$ v* e4 @% |. b) }
    predicted= model.predict(x_test)2 F4 i# B  R. A3 K4 j
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。) B8 d9 s* _4 _8 p# Z

    ) A7 e8 ~9 F* l/ M% L* b原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    3 J- L( V, M9 {2 y% c————————————————
    , A1 N6 |! q  m版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( ^9 N2 V  o7 m/ N; W* ]6 i+ U原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    ; p# Q6 W) R" y5 z* L' {4 C* }+ Q. w( k" K/ X  }% {6 ]
    - T2 ~$ ?' ~+ {* z* \
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对2 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-31 22:51 , Processed in 0.193250 second(s), 50 queries .

    回顶部