QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1324|回复: 0
打印 上一主题 下一主题

机器学习算法整理(内含代码)

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 16:23 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    1 x) D; _9 c0 y0 g3 P; {! I
    机器学习算法整理(内含代码): g* _( S0 U" z% K% M

    2 x( q- P0 S# B" x一般来说,机器学习有三种算法:
    ' ]2 s+ f( Y7 k3 u5 {0 j9 a  G4 ?2 t5 o+ c
    1.监督式学习- n- Y0 R& Y/ J/ U% A8 @4 M

    / z' e% Z: J# Y, v" \4 i& f$ y: }/ S 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    , G$ t5 \9 x  Q4 p( h
    : }( G; K  d; @9 n9 _' P9 a属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    " V. M* u" O7 V) E& B' j3 T
    ) {4 d- T6 @" S! j7 R2.无监督式算法( Q# o8 a9 A; {
    $ U1 t$ g8 j. o) T( f
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.7 s$ [) l7 R/ U, ?# [) T9 q
    ' W9 b! }! k6 k* L# Z  I
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    , R$ U5 p/ r6 p
    % T, C% a0 x& \4 ]1 A/ k& d; ~3.强化学习
    ) T6 w9 L1 s9 B8 p# ?" x# j7 D3 e8 n, N
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    & D6 x, V2 X* A8 E7 B0 `- P, n, L: b
    / b8 o# T  D2 T& E属于强化学习的算法有:马尔可夫决策过程  z  H6 U- o. K& S
    . z* t( C  s( N4 ~; R& F0 |
    常见的机器学习算法有:6 }/ c9 O# B2 O$ }/ _$ y

    : a! M2 ^# L* M# [  `0 e2 P% Y! b  t8 Y0 V4 N0 l, c4 y, ^
    1.线性回归 (Linear Regression)
    $ t! E) c! ]- [2 p% x. n8 l& E# s* T' l: @
    2.逻辑回归 (Logistic Regression)5 v$ m6 z. s! W

    ' N. ]) W9 j& m; H* d/ e3.决策树 (Decision Tree)5 M6 G1 b& ^* U% [1 g! Z

    8 t* s6 S8 P7 Y6 p& L' a2 e: |4.支持向量机(SVM)
    : s4 N9 `0 n" C5 h) i
    $ B( k1 _$ |4 |9 F9 M) u5.朴素贝叶斯 (Naive Bayes)* Z  R3 k3 ?' k0 S9 B
    1 Y* d9 u! m4 F9 j7 f
    6.K邻近算法(KNN)
    3 u( r1 e6 D. m6 ^8 z& h
    8 N9 t; y" v& x; [2 N2 V7.K-均值算法(K-means)5 |9 r: J/ q/ r
    # E& i/ n" p: }! E1 x5 ~
    8.随机森林 (Random Forest)
    4 z' i2 L0 t& A9 }) G; @; ~8 v; ]& p
    9.降低维度算法(Dimensionality Reduction Algorithms)6 R- M( }8 X+ h  ]0 b. {; W
    : k8 R+ N9 N) W2 `5 A
    10.Gradient Boost和Adaboost算法
    * _- d+ P7 s) f& t2 J一个一个来说:
    * y6 Z/ e! w2 J+ ?0 ^) h) I8 C1.线性回归
    ; ]0 A0 H7 X9 [( {; Y, T
    * K+ w1 J' I* o( w% X( N0 m  U: {线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.; C& c. s6 N' U
    5 l2 }, r; `) T
    在这个Y=ax+b这个公式里:  d- J) Q) k+ I* c  |; b( V
    2 @; _0 X* }+ o7 ~. y: `
    Y=因变量
    7 e8 V7 ?1 q2 O" ]( l5 g; Z
    ! H" v  O) M: J2 R2 | a =斜率+ x$ Q7 k. Z7 ]  }

    - G" o& N* ~1 u8 ] x=自变量
    & U0 {) G, f: e- L! X
    9 q& ?( k. S' y) R1 \/ h b=截距/ i- e  e) M# }

    4 b5 n0 K8 ]/ \+ p5 } a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    6 z1 {. }; M/ ~9 d" k" j! n
    ; A  T4 g( i9 U- V1 c* q' x0 Q( I我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    - q; Q( i- U% x5 G( Z1 v% ^1 D$ z: J. W# j' N6 {
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    7 ?6 g) ^( T' E+ G+ d8 w
    1 ^# }$ f0 O' d9 z. C* o+ K' ^* g- @6 S, T# F

    2 R  ^' G! X' J# g" l线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.: O0 K/ i" O2 E" B0 L

    " {8 h3 q9 s+ F! ^9 r  E  M1 C( _拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    + l4 y! x1 }" o: Q% L8 @( x' q: B* @& w, c' s7 H# ]2 c
    Import Library
    2 o7 B3 x1 P% vfrom sklearn import linear_model
    4 B- w+ G0 b& w  `" `0 Q7 s! D5 |, u2 Z( [" B% v
    x_train=input_variables_values_training_datasets
    . R0 f3 ~" h% }1 L4 v6 I  Z7 iy_train=target_variables_values_training_datasets! |2 e" c, S( f# F; l: x
    x_test=input_variables_values_test_datasets
    . j, g9 ]2 Z, w; c
    ! G! Q) ?7 ?# r; R4 ?& B! l" D# Create linear regression object
    0 C/ P2 B6 U: O& Qlinear = linear_model.LinearRegression()
    ; c* }, k5 \# h( n  A7 Q: B. w, ~
    # Train the model using the training sets and check score
    " D  Z, @$ s4 T* w3 J8 J- X( Slinear.fit(x_train, y_train)
    ! X3 k7 o+ `8 {$ Q4 m: Jlinear.score(x_train, y_train)
      Z7 r1 n4 k: f  R6 A( z; }% L% D7 ~0 J) {
    #Equation coefficient and Intercept4 w" F" m$ K# i# l9 ]3 h* R
    print('Coefficient: \n', linear.coef_)
    1 v! ]6 k7 L# p- I# \, }print('Intercept: \n', linear.intercept_)
    - H! j+ M! Y) K0 \5 j/ J1 A; X9 W" Y0 S1 S# w( A- E6 i
    #Predict Output" G# z5 i/ S6 j. B& G. T& I6 x
    predicted= linear.predict(x_test)
    ; C4 b5 @* Q! {2.逻辑回归3 K- u% u+ ~/ @! K1 w" h
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    - P- m  n) I7 q0 v6 f9 e7 E' v- A4 }; }$ b" ]3 Z3 ~5 }
    同样用例子来理解:
    3 f# `! x9 G1 V  `# X. ~  w' b: c0 Q# T0 w$ H& J, B+ U2 `
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    # c$ ]7 o: ^* B! g) V0 P( o' S2 `5 x& n( g% B/ c
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧1 s9 s  ^* o0 Z% q
    ! |: y; N( P% Q9 Z0 b
    最终事件的预测变量的线性组合就是:: ~% D5 R( r8 N  b8 w; W+ U1 [
    ' Z* L- C7 y* h) O

    ( g/ l! N$ B3 e; e9 }odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence0 K* B1 O. b9 ?' H- }2 ~
    # i% p9 w" |! n( P
    ln(odds) = ln(p/(1-p))) o% P# x6 T+ S- m5 w: n' y8 A
    4 y9 S! Y* z: O4 H+ M. [- p2 K
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    8 }3 b5 G5 M1 H  Y* H2 D5 S在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    ( v8 t5 N1 j0 H% G; R: Z0 p5 P) Q: W- i8 Y+ P
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    ! l6 }! Q& Z: l% X
    . B5 D3 o3 E9 K9 {; s$ ^
    & p9 k; S, l" i% E8 j! r2 W7 `7 K* ?* {- ]- H
    from sklearn.linear_model import LogisticRegression5 v' S/ R( }! F$ [. h: n
    ! d2 l. D' W/ E% U, h" W3 Z* A* s
    model = LogisticRegression()' ]* U/ y+ Q4 ^7 a6 z2 c$ i5 T; U

    ( S2 t. ^5 m4 @* X9 Z0 K  G  ] # Train the model using the training sets and check score) l3 q* b) ]0 l, ?+ l4 S
    model.fit(X, y)" B& o! P1 Z/ Q, B0 b+ R( i& H
    model.score(X, y)" s% g# ]: p6 v+ m, F! V
    1 v* q/ D5 h, r2 Q9 i8 L( c* X
    #Equation coefficient and Intercept
    ) s) h& @# J4 P% `* h" Q print('Coefficient: \n', model.coef_)
    9 N( }. f4 Z9 M2 E) p6 x print('Intercept: \n', model.intercept_)( V: X0 Y, N5 Z( W2 n# H+ w
    ( F! P! ~- }& w; ^
    #Predict Output  o' r4 R, [+ d. S% B. R
    predicted= model.predict(x_test)
    - \3 g7 L$ X2 i" B5 `+ y逻辑回归的优化:
    ) Z# w2 t* a7 @1 A. O加入交互项5 b  z  N% p* R7 t- K/ A
    , L9 x5 y' [! e9 m+ i
      减少特征变量
    8 D  A/ x+ G1 c. I" z. G- M" u6 J* f4 l8 G6 g
      正则化1 |; Q  N  d! L5 h: K3 Y

    1 ?9 u$ Q/ f$ ^! b  使用非线性模型
    & Y! _. {; Y: e. `# O; p6 \! i2 E- D" d7 F' ?) g" G
    3.决策树; s. N9 A. U0 n% t
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。3 _; f; ^0 }+ q  X) l4 l. R
    / |% a5 C" E0 V* n2 Y, }8 e' \
    , }% w3 A" h  C% W

    1 Z! @' O8 I5 J4 L$ e0 }8 d从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    ( o% c8 d) k/ y% d0 O8 o# `) V
    % y  X2 v* T& ^# d) G) x9 e8 M
    : o/ }" K$ h: }  ~9 Xfrom sklearn import tree
    6 U7 A1 c7 }) @1 h* h  w& V& d  O8 p7 x9 ^  \( E
    5 _+ n4 Z# x9 n+ u
    # Create tree object
    , B& a+ [7 k' i2 q  pmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  1 {4 y: e' m1 y6 w, @% w- K: o' d, R
    : H  i3 h# M8 L4 R0 o9 i, t
    # model = tree.DecisionTreeRegressor() for regression  j3 F* ]& B2 q" R% b

    4 c, j- \! ?! e! q5 \# Train the model using the training sets and check score
    2 |( ]8 c  @6 a' d4 s( I. Q7 r. F2 |model.fit(X, y)
    ! D- B; O2 _6 jmodel.score(X, y)
    1 w$ r# T' X2 ^- @& D# J" U7 H- }: L( \5 Z! |4 t9 G6 E; ~- q
    #Predict Output
    % q/ f1 S" }# q4 A: Spredicted= model.predict(x_test)
    . _7 M1 I2 r, T- m4 u/ ]4 q% m6 p1 a, d4. 支持向量机(SVM)
    ' H2 u. I" ]9 L+ N2 Y1 }) n  q这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    2 m+ J( ]/ R- I( |- i
    ) S9 X, h/ X3 u& O  b+ R现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。/ B% z2 @5 ^, k% @# Z5 w

    - H6 @; x, ]8 J7 \" `' n
    7 B# H$ A. S, m, P8 v5 ]6 L, s. p  n; D
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    - {+ _( k: P- T! q. ?
    8 K/ H% T. k* B9 X4 m( r' S, k#Import Library
    & ^& Z& C" \: ?% D, n6 m4 ?1 sfrom sklearn import svm
    ) m% g5 y- O- M5 z! q4 t. b#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    6 G( J7 ~) O: c8 p% R2 }5 i# Create SVM classification object
    ; V( e0 G9 ?6 {* S( t. d! N
    9 W, q3 O" A4 N: [+ Bmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.% O7 U  Z! I$ m# k

    6 j, q% K; [0 ^5 c8 p" r# O8 E( Z# Train the model using the training sets and check score
    7 p: _2 ~9 q# G5 x$ p- Zmodel.fit(X, y)
    / K! O; L+ ~- v+ xmodel.score(X, y)
    ( m! y) f/ z; x2 Q, Z" s9 w4 ~* n5 E( D) K3 {# U
    #Predict Output/ h/ f0 h4 F5 X" D
    predicted= model.predict(x_test)% ]2 ?; i+ s8 p! @( s  O7 A
    5. 朴素贝叶斯$ F6 h0 b9 i: h* F* k$ I; x
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    * M7 J* N. C$ E! l: _4 r: V1 Z: \+ r) g3 G
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    ( k: l) \$ T' K& @' ^
    0 g3 _' {2 x( f. D, {贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:+ g. Z$ c. @! P, n8 I+ E$ B
      k( x3 p. s6 z" P7 l$ [% k
    $ o9 W9 H, n$ V$ }
    P(c|x)是已知特征x而分类为c的后验概率。+ [6 [8 i, Q: K2 D; _8 B

    / p" A0 V# k9 Y. K+ ^8 V2 nP(c)是种类c的先验概率。6 j3 `( C5 o; e0 P

    " g" c' A/ c& b: q1 F# C0 kP(x|c)是种类c具有特征x的可能性。& a/ e1 {) r9 {6 ?4 L. o

    $ q7 t; l! V) C8 m; {( C8 r# cP(x)是特征x的先验概率。
    ' T% ?+ F& p+ G8 L# t5 t+ k$ e
    9 Z% g: }* Z5 t4 e9 d/ c$ G* I3 ]6 b  g8 ^6 r# I- [: ~# H% x+ r
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    : `+ u6 @6 M  \% W, ?2 K5 ~. q# ?+ M2 S
    步骤1:根据已知数据做频率表4 Y9 y7 c* I8 E" ?; a
    3 V/ Q) F+ b8 S3 ^
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    ' x6 I4 u- I" K1 W9 Z7 \* l7 V8 S/ C
    " i! a  Y- d- y! y. V/ E3 E( J3 o+ ]- C; K6 s! J# F" t
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。* K+ w, a1 R) i, G) y' K! e
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    2 Z( U" W( n) P5 T- f3 J& X/ W7 C( S- S
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    . N# J0 i# E) V
    ) u' L3 x6 y- W: r, c这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。' z( z% d# b4 _2 M$ |9 \4 U  j6 M& Z
    ; |% e3 J0 w9 }8 N6 h
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。- }6 f4 X4 `: M

    % T6 i2 Z7 N+ ~9 l& ~" {# l7 U当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    5 W) Z* r& z: J) Z% \1 q& _1 P/ o3 u% k* n8 A0 I7 g
    #Import Library
      H0 q7 L2 z6 t; wfrom sklearn.naive_bayes import GaussianNB1 W1 F, O% b* Z2 O
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset' P! B8 B- D; X1 y( e
    * C/ F; g4 L% ~7 x
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    1 J* G1 x8 _- V! v0 Z/ \
    ) \6 R) n' u" ^0 ?7 u; K# Train the model using the training sets and check score
    % e  H5 }  ~0 u( \: Bmodel.fit(X, y)$ Z+ W% R% o. ?0 x6 \
    % F5 l+ H- e3 g% }7 Q
    #Predict Output
    - ]7 y2 b8 T+ l1 e) cpredicted= model.predict(x_test)
    ( q0 A' v+ M. o6.KNN(K-邻近算法)2 s- |4 c, a) C2 Z
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。) p: F2 Y* A0 W! j8 r% }3 b
    + @' H; N3 J1 x1 m
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    * G5 C' x4 p+ q1 L# v0 c, R' L: |; Q7 q: |" o
    5 K) i  e! B( ~  H7 ~

    % B' H7 ^0 h6 N" y9 k' Q* q) J0 D7 _KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    4 }  X% V8 E# u7 m3 G; l' v- R7 A+ d$ u3 |5 b; s0 X8 a
    在用KNN前你需要考虑到:4 X* C7 j1 T! h# g. l1 g

    0 ^, Z/ U% t7 ]  nKNN的计算成本很高& O0 c! L3 |$ k* N0 j
    3 O$ T' _& Q( ?7 a& `; ~8 G
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。9 n) w' j6 m$ }* b7 O+ a
    6 g, I% ?& F7 r" ]; o# a7 R+ r
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    8 j! ^0 e* m! x7 b. X- L
    9 M% t' h6 B8 K4 }3 c+ _#Import Library
    0 e" r+ k/ J0 B' t$ q8 Zfrom sklearn.neighbors import KNeighborsClassifier
    ' |  X& S) `* l- D" B2 ^- U9 G8 n! {1 o% [4 W, p
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset3 B2 q; ^5 v3 X) D" `& }# D
    # Create KNeighbors classifier object model # _" x7 G) J5 f0 P- {( ]# f  ~2 k

    , [8 D2 D7 D; H: W  K) }) |KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5, H" f; y  [8 L& L8 V

    $ _8 C. f  T% I# @/ l# k4 J3 O- }# Train the model using the training sets and check score+ S" ]+ m$ H! g0 v7 w* w4 o
    model.fit(X, y)
    - U  R4 O4 ]4 F/ w% _
    9 f; \" o1 P9 e4 q3 B5 n#Predict Output: I1 C  w" j( }% @5 \
    predicted= model.predict(x_test)
    . o# H& u  O, z4 Y9 {7. K均值算法(K-Means)' I# O$ q7 \7 b, u" ?' ]
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
      y# ?/ M# j" ]8 L! o; A$ x7 j+ N; R2 ?0 d/ ~2 z0 p+ A
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    + n1 E( B& a# p# N: D* w+ b$ I
    ! n! R4 X! E3 b/ J& h( i  H& h* V, F4 k
    % g- D2 j4 P* F% E: d" }* |K均值算法如何划分集群:  s! ?. ]6 c6 O8 g" a

    . I2 T: o' y" G1 V2 [+ Z3 x) n! w4 I
    ; R& _0 {8 Y1 {+ o2 l) ~* v+ w' O% G5 T* P' I4 u
    从每个集群中选取K个数据点作为质心(centroids)。
    8 a: [) e7 k8 A) {4 X: g5 w: }
    4 N, D+ j1 [/ o% ^将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。0 G% n1 N* [1 a
    7 a3 J) i/ ]0 c
    找出新集群的质心,这样就有了新的质心。
    ( t- Z/ d6 H- V8 P4 \/ K" I7 t0 X* r9 q5 P+ R3 g. l8 U, h
    重复2和3,直到结果收敛,即不再有新的质心出现。  g" @1 Q4 @! Y% h

    , E+ U! J8 o6 H& e
    8 G0 \/ f, I2 j( j6 `3 l怎样确定K的值:+ F2 y6 b5 T+ X+ T; v
      n' P7 E+ _3 \# R3 Z- e% e4 c& t
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。( x9 Q" y  M2 b
    + _' e7 f: L2 k
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。9 _$ L0 b7 r3 c8 a1 f' P2 _5 M1 J
    2 L" F. U" I' w% y" z! D
    + B# A  z& d' i7 {0 F4 }
    #Import Library- {: ^$ b# R$ `& Q
    from sklearn.cluster import KMeans
    3 _+ i0 |; U+ {$ V
    . \" y; x5 x# A3 H# K#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset! Y# k( F  k; p* L
    # Create KNeighbors classifier object model 4 v4 c5 ?( [- b  ^$ }( b
    k_means = KMeans(n_clusters=3, random_state=0)5 _5 D- @) B) x% D0 x% V

    5 Y* e( u1 s. S  {- x: Q# Train the model using the training sets and check score
    . I' L5 `: F. B, D) V5 I% F7 V1 umodel.fit(X)
    * K- B% a9 X0 X* t0 x6 J& c" |7 {4 W! L: |% G: k
    #Predict Output
      a2 n( D& F1 E" @' Opredicted= model.predict(x_test)  Q& d! o7 K! l
    8.随机森林
    0 j# c! U( Z2 k$ f9 z% C随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。0 ~  t2 c8 F' ?+ u( ?
    . K% t5 Y  S7 i" A0 G% K% U
    怎样生成决策树:7 [% `1 c) z2 ]

    - d* K! f: Q  S7 M0 j, h8 t$ z如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。3 ^( J* X0 A5 a! [& a, @
      X  y, ^' @  i3 V, a7 ]$ }6 y
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。) R# \( [% u8 d& I" z, z6 f- D: P

    ! f  C# F2 y4 h& `* C9 W; x每个决策树都最大程度上进行分割,没有剪枝。9 a8 ?; j+ t! ?% {7 R* h
    5 o2 E2 m0 H: i$ W$ ~
    #Import Library1 j* j3 ~- k' I( n! z! f. R. d
    from sklearn.ensemble import RandomForestClassifier2 @. p+ x* @. o) t4 V$ @9 ?
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    7 W+ t' J2 x$ t1 }) R' h8 I$ ~
    9 a& Y+ G/ y5 \% M3 j- e7 E# Create Random Forest object
    2 d" J8 A% F1 a- J) Pmodel= RandomForestClassifier()
    & X- ?' A: J1 q) _( Q/ R7 D5 o& m5 S* C) J7 }
    # Train the model using the training sets and check score
      X: H) m% l' N" ?2 X" @: m8 Pmodel.fit(X, y)7 ]7 q& W0 H* r2 z) }

    ; _* [6 F- g* s3 z) Q$ W. H#Predict Output
    : J& x; t: b/ b$ l1 Kpredicted= model.predict(x_test)% D" Y! N5 q- d
    9.降维算法(Dimensionality Reduction Algorithms)
    - I; Z: h5 m( [在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    . @* ~& E% s2 m; B( `* U3 R5 m3 e5 z. r3 F! i, o  B. F
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。. l9 {8 ~! W) y$ \
    # J( v1 F5 `+ U0 V$ q
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    + u8 _) n) A6 ?2 ?' g4 P- A% ~+ i. W; N* V/ @% z9 x1 n2 N
    ; w# Q5 U# c; P# Y) D8 `# N" V
    #Import Library
    3 I- u" ]3 O* J9 D" f7 mfrom sklearn import decomposition
    - _: a3 s  s$ |. G#Assumed you have training and test data set as train and test
    8 y$ @. Q+ B2 J3 c7 d# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    $ U' _- _8 i) e5 T/ C+ }2 q# For Factor analysis. O; U) ~0 K1 C% e7 y+ `: b0 |
    #fa= decomposition.FactorAnalysis()
    ; N$ }( X+ K4 Z& g# Reduced the dimension of training dataset using PCA: S2 O5 \* `- x
    & L) c# t: ~4 T) j! _' {
    train_reduced = pca.fit_transform(train)
    + |7 f( K  u  x1 C0 k% J2 z. c2 a5 j( T  w* l) S
    #Reduced the dimension of test dataset3 q+ h! R, i  ]4 z
    test_reduced = pca.transform(test)
    - o! N! @& K; ~# ~9 H10.Gradient Boosing 和 AdaBoost! |9 U& p, A4 S9 x) o4 `
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。& F* }# g- K% X  a
    2 d& D- ^9 o' L8 k$ |' T5 G8 K5 Q  k
    #Import Library
    9 B1 K% @8 |- N* z4 o  r" yfrom sklearn.ensemble import GradientBoostingClassifier
    ; e. e% X% z+ F( ~& L; U. |#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset/ [1 B. r! }; u3 v
    # Create Gradient Boosting Classifier object
    ; _  X2 l& ]- C! o$ v7 emodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    % L5 X, U) j# W2 W* w# J$ @$ I5 R. d+ U: c* g/ _
    # Train the model using the training sets and check score
    7 l& v; w0 c* R* k7 smodel.fit(X, y)
    # z, K% P  H' j) O( W5 `# _#Predict Output; H4 K/ R+ ^3 h- D8 o) f- q
    predicted= model.predict(x_test)
    # |# w3 @( Y- [- q2 YGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    8 _! g5 h& Z% _& t6 ]: \4 c7 v9 O5 `* j7 w
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/511913865 ^1 U$ t: ]! b  U. _
    ————————————————
    : e1 S; \1 h$ Z& r版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + w' L! T1 [. y$ `3 f8 D+ h1 n& V- H; d原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    ' R, ?- \3 G! U9 F5 G3 H) ?7 D' r
    * x( u( n# B8 p* A2 D& y
    & i8 m0 ~# h6 q2 b- N0 _0 R$ x* r" M
    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, 2024-4-26 06:56 , Processed in 0.384686 second(s), 50 queries .

    回顶部