QQ登录

只需要一步,快速开始

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

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

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

5273

主题

81

听众

17万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 16:23 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    & w0 Q% @; `- a$ Y
    机器学习算法整理(内含代码)
    0 N' w% k. {7 z& S# N+ A. D/ Y9 ]6 T. a8 s  m
    一般来说,机器学习有三种算法:
      N% m. ^, W$ k( a9 ~
    & n2 ~1 Q0 T" r. k& F/ M/ g# m5 Q1.监督式学习0 n: E7 V6 q4 }8 S; l+ P: i

    % O0 l. B3 E$ {; w( H9 R 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    7 |0 ?/ {9 m; ?" p+ R9 h. B8 V1 Q1 s! Y
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法! `+ w& w( d1 i/ m- r9 s
    2 H' Z3 h( _0 e3 P
    2.无监督式算法
    # A  d( j. E" k) I% c( a% \$ Q, n* G  e$ k" ~
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    9 W% {7 `" s5 t$ k/ R' B9 V6 L5 a! y- C
    属于无监督式学习的算法有:关联规则,K-means聚类算法等7 n6 F% y$ C# q! o

    ( U8 p; ]$ M; X0 \0 v3.强化学习8 R6 U" Z: H( T" B; K" W

    * E& S) i1 q- ]5 K& E& l/ D这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    0 P" f6 B( ^6 @7 Z5 M. f/ u# w) c* Q( V$ Y" q' u
    属于强化学习的算法有:马尔可夫决策过程
    9 F* g* W* D3 ^2 R" z" B6 }! y4 t+ ~& Y! D
    常见的机器学习算法有:7 \2 A% \, ~/ C5 g, i) i
    % a1 ^- e. V8 A& [

    2 U" z* ^# U7 Q1.线性回归 (Linear Regression)
    " \0 b( [+ j+ o, V. j/ ~& n- H4 i+ t$ Q+ E3 A& I$ g
    2.逻辑回归 (Logistic Regression)& b' ^, P6 b' J" E- a

    ) w4 D' V% R5 _2 c1 O) V3.决策树 (Decision Tree)
    : ~' [* |- T9 n3 ^: j# F5 k9 I* ?* w9 W( K9 i
    4.支持向量机(SVM)
      G/ o$ e" _' K) a' C4 y( K( c  B2 B4 F4 I6 w
    5.朴素贝叶斯 (Naive Bayes)' f& s/ w0 r) x% }# |, A2 g7 [1 o
    + ?7 i: ]( ?0 c3 `5 d; S
    6.K邻近算法(KNN)* I0 a: `( `4 a, ^

    4 o) x+ ^1 A  t. F) {  J9 A7.K-均值算法(K-means)
    8 X- u; S' [) N  A3 |! {; x! h1 L! ^
    4 K8 C- N, }  z) ]8.随机森林 (Random Forest)4 E) y4 x: s1 r7 l
    3 g) Q! Q' S: C& ~5 T) c2 S
    9.降低维度算法(Dimensionality Reduction Algorithms)
    % b) d( Q. r& R$ z5 x, j4 p3 F& k
    4 @( g7 e2 j" \5 _10.Gradient Boost和Adaboost算法
    , u* ?+ ^, C, r2 P一个一个来说:8 G  Y" r, w# f3 v+ V& X. O
    1.线性回归, u1 r& Y: \; Y4 [( G

    , m( \- m3 m( a9 T, E$ Z& P4 Q线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    ' m+ F' O# }0 N9 a. Y4 ?
    ! c# k3 T' T1 n! R在这个Y=ax+b这个公式里:
    " }) I: B* B8 ]% e/ y$ e
    , U% N4 S. Q" l4 w! j2 N) B% W Y=因变量: f; o% M+ t* O/ ~! Z3 T5 T

    4 l' z4 ]! o* `! i: b- | a =斜率3 g4 i6 D' c! r. R& e
    % ^, c7 I5 J9 J
    x=自变量7 X0 l, }6 Y  L0 P' b9 h

    ( p7 t4 Y6 K( U2 o5 m1 V: h b=截距, h3 L8 i7 ], w+ Z+ h+ V& L
    % r: |$ z- ^1 C6 A7 w; t$ l0 m
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)6 Z, z& r$ W8 U9 Y* f: u) ?# A$ a

    2 K# l. U3 f& s  \4 e/ `我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    2 J9 j+ R5 }* p$ x4 Y7 n0 Y4 i* p6 U! `
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    5 e6 O2 T: ]1 i4 F6 M4 t* d5 o+ d. q" r
    ; z4 _8 R$ q9 l. ^9 p3 A+ U, B

    $ I% u' T2 D) J+ w# E  q线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量., m. Z6 I* q- e' ~, H

    + P  C! a  y' d) k: R0 u7 Y0 F3 ^拟合多元线性回归的时候,可以利用多项式回归或曲线回归( m6 g) R2 m- k- J6 _! p) g

    , ]" A& k. v7 eImport Library
    5 M7 h% k* W8 n: T, Y5 m$ }6 tfrom sklearn import linear_model! ^) M5 R: i( u" [0 g* O
    % C+ P4 W3 N7 a3 c
    x_train=input_variables_values_training_datasets
    1 J1 |5 m$ g% w2 a0 |7 _& T* Ty_train=target_variables_values_training_datasets" ]' x7 d0 e5 r6 s: |
    x_test=input_variables_values_test_datasets  M6 I1 G: ^* K0 \1 H) E
    ) L0 C& q2 ^. c* X
    # Create linear regression object
    ) x" J! ~3 Y9 t+ G7 ^linear = linear_model.LinearRegression()
    + l1 u6 G8 S0 h: w* p$ I+ @! T: l9 R9 A
    # Train the model using the training sets and check score
    0 A, r* u* l' F+ H. D* i* klinear.fit(x_train, y_train)/ w+ K% [. n7 j6 x# W' F
    linear.score(x_train, y_train)  C, k, d2 N+ M  E2 ~% d

    * {3 ^" y; f" K! O/ s- D#Equation coefficient and Intercept, k) M2 n, f4 ~+ I/ g  s
    print('Coefficient: \n', linear.coef_)
    ! `6 Y" k" p4 Y: _print('Intercept: \n', linear.intercept_)
    ) ^! v7 ]' e' j) Z4 F7 ~1 ^* j( `8 {" P2 m  I1 u
    #Predict Output
    9 K6 @) k% r+ J7 Ipredicted= linear.predict(x_test)7 @' w$ K3 E, g2 E) }9 m
    2.逻辑回归# z1 l( `( q1 u* {9 s
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!- P8 Y( }+ J/ G. R- \
    1 a; f5 [4 N+ Y6 a$ A
    同样用例子来理解:
    0 ]) T% @. D& ?5 S. ]$ M4 h/ I" R: n: [" [" r1 O8 y  X
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。' B1 u3 m& [+ _4 w, z& o( c

    * \; |1 E8 _! {( u, b# T数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧; m& r  n7 M% _8 {4 K3 v* r

    ! x0 }$ j0 Q) Z. U* o最终事件的预测变量的线性组合就是:/ k8 U" b4 t5 Z
    ) L5 d" ?0 `  R; D( v4 x* h

    ) _, E% A- S+ c" Eodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    ( N1 _% |* n# F2 t# \( a: V7 A: g# I1 |# a5 g& S
    ln(odds) = ln(p/(1-p))
    3 {8 ~4 U- P8 [+ [( y: G, E2 H& k6 L  {% O: Z/ O3 ~
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk: M0 b$ f8 i# ~5 H, ^* w
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.$ B8 s* J' \" m
    . M1 o: v* e  K
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    - h% a( A% v- Z; r5 ]9 c& p8 P7 p
    ( X2 @  \3 C/ W. o0 }* j

    * G; ^( G7 b5 t3 Z- C0 e# N from sklearn.linear_model import LogisticRegression! y4 i4 e4 P6 A! F8 R5 T& ~! K
    9 {* d1 E8 _: z/ Y# p
    model = LogisticRegression()' j( c3 B$ Y7 x* V' E) N) e

      s9 }& k9 _7 T # Train the model using the training sets and check score  X6 y4 S7 f# D
    model.fit(X, y). H  F! ~3 Q% K: \5 ~
    model.score(X, y)! ?( c( P/ N) K* J4 {
    9 ~5 ?) w' |" [1 P/ P
    #Equation coefficient and Intercept
    6 }( D& j; t8 G# |- e  t0 w/ o! j print('Coefficient: \n', model.coef_)/ n/ o! H5 }" r( W4 Z
    print('Intercept: \n', model.intercept_)( _) i. {- x# @: U3 ^7 ?

    7 \9 ~" `" z% G+ }3 }! q #Predict Output
    2 c- e2 [3 f$ S8 C& z' J predicted= model.predict(x_test)( B- q1 O' g: g4 R1 \) h+ @  b4 ?
    逻辑回归的优化:
    5 N; m" M0 H5 E$ X9 Y+ q加入交互项
    . p1 s) v, p+ F) i5 ]4 c+ U7 e: P, @' }2 ]
      减少特征变量
    % u2 ]# f7 w9 p; ]* f0 k) G1 ^: S2 }* a% O
      正则化
    9 ^$ G* Q$ m4 s3 p3 f. `$ e  S4 |
      使用非线性模型( R8 u8 G0 k6 b/ f7 [

    : q8 ]+ X$ ?& T* I3.决策树! q2 v; V: B* e( h8 z
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    2 h6 Q8 [2 l( H9 W2 t$ B% ~! I  i
    % k- Y0 Q& x$ u
    - C" K4 G4 h- t2 @) ~/ [# P6 Y% E4 b" t0 i/ ?# H
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。/ H: o% I- A; |* [

    * D# Q9 B2 o2 H, n1 q
    + h  m( Y" k; M7 U, `; ~from sklearn import tree
    4 x' |, P# ^5 `, _. c4 t2 \3 B- e4 X& k$ A4 N* _1 {
    1 U/ E; k7 U2 y; Z$ B2 q  f8 o
    # Create tree object
    / B( s3 J8 C5 q) Lmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  1 d; x' m: q' \0 r

    ' l) E' |* B; J# model = tree.DecisionTreeRegressor() for regression
    & L9 X% p3 z5 `& C/ d) H
    ; y) f( h7 p5 a1 Y# Train the model using the training sets and check score: X, N. L2 `# g$ a
    model.fit(X, y)
    ( k0 Z* X2 v" l; k% f3 Z( Vmodel.score(X, y)
    ! |8 ^  W! X2 Y8 x; l9 h1 Z( _, L7 r- e
    #Predict Output
    : s9 j( z8 r/ |  J* `- y+ _0 L0 m  A* n4 ppredicted= model.predict(x_test)
    8 t/ K7 Z+ K: o  y; M4. 支持向量机(SVM)
    1 r$ F: ~$ Z: n+ v0 m5 B这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。% r. y6 X$ e0 g/ u, d( {& Z

    $ F* N" [; f1 {6 n现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    4 U1 w. M7 u% ]. T% {7 B
    7 q8 m  [; r# z" A2 I+ Q" B; k( L) g0 A8 k3 r9 r7 X
    8 c8 }/ o* ]) R# a
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。/ V$ ]  @5 n3 d% {; k# Y9 }( X

      \1 r8 m1 s  Y) Q#Import Library7 K2 x- y* s6 @1 ^. _% {
    from sklearn import svm: O9 A2 m$ N/ n2 L7 t
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset( J) f* ?7 ~2 {7 X  `( F+ j
    # Create SVM classification object # p. W3 _8 ?/ H* n& x3 q0 J

    ; `8 v; L% V3 Z; a- r& B; Ymodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail., M% H5 h: D/ s2 H3 r4 K  }$ K$ e

    / ~4 S' z! _. C# Train the model using the training sets and check score0 S+ r" T4 ?% n6 |) M' x
    model.fit(X, y)
    & N) ~' }, C2 u! g6 C+ emodel.score(X, y)
    1 X4 B8 s2 i+ w% |: a% F0 M9 j
    " R+ |* ^  p" @0 m) B1 y: U#Predict Output0 ]$ ?* m( n) U& A5 E3 a6 |
    predicted= model.predict(x_test)0 q3 D& k. `" I/ {
    5. 朴素贝叶斯
    3 d' C* ^# Z% Z, z7 w这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    ) x; J9 w/ t9 H' U1 i! u' c5 p8 h5 `" V# H- A/ b
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    # d5 }0 A2 }& t4 z1 `% U
    6 K% U. v% m, H, x& O贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:5 l; z% T8 r, l! r5 [
    : r4 S0 H8 P- j
    0 \+ s$ `; j, L: D
    P(c|x)是已知特征x而分类为c的后验概率。
    ( A5 s" v3 S9 B9 V8 D3 j: ^# }+ G! g* P0 ~: r
    P(c)是种类c的先验概率。, C7 S4 \/ Z* T, |- `( X6 w

    : H( R' c: J! K/ _P(x|c)是种类c具有特征x的可能性。
    / Z1 G) B3 @4 Z& r# q8 \' n9 A3 J, f6 r1 J! t0 v- u- X
    P(x)是特征x的先验概率。
    * {6 [) `) j" T' m6 N
    6 o6 m( m0 c5 f5 m4 v
    6 \1 o& O! j" {7 f5 z" k2 q3 D例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    * D/ A5 R& b) ]7 j9 j8 B" I
    3 P$ w! h: B5 M3 k步骤1:根据已知数据做频率表8 A$ G2 p" o. z7 I

    1 Z: ?* g' o, w) c, Y. T4 O# B步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.& ?) w- `/ F# U  X+ q! X

    - h( N$ O& r( U& K& a& P, y, d% o( l
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    ' o7 W% j" I6 T* Z( o2 K/ G提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?0 a% C4 B. g; j/ u3 F! R' Y' ~

    0 H9 A0 u3 u& }" L1 }. [0 @我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。. K4 E/ o5 c) S7 |
    ; w2 V5 V7 W: A. |7 f) l% |4 e
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。4 K1 v- O6 Z3 ]+ ^) s
    ! ]6 u" D: u5 B$ x
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    8 a* k  I) _) U, s2 [( i0 z) L0 B- F. W# Z
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。7 C' C, y9 W2 ]9 V" [, _/ \
    2 H9 K/ z$ q  M5 R9 V: m8 a! u) b
    #Import Library% F( U' p2 t2 T1 H  x. e; J' A
    from sklearn.naive_bayes import GaussianNB6 H  d6 q! ^2 q4 K3 j' U
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    - e2 D& N% C/ A8 k- A; E, H$ L% w; K8 C+ N& F
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link* Y5 a+ N) G' w6 u! p7 ]' o
    ! E1 V6 P+ |4 y' _& {
    # Train the model using the training sets and check score
      X2 G$ R) r- g7 v+ j. r- rmodel.fit(X, y)
    $ h6 V0 Q" [/ q# i/ \4 P
    / |, ]3 D0 c* H1 V0 p4 v#Predict Output5 N- r* _  P& o0 u( k
    predicted= model.predict(x_test)
    & t0 C  d3 w6 ?  T; E6.KNN(K-邻近算法)
    % U6 u9 M( |; m% k# K% J这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    8 W  D$ V3 E9 j. z2 @. J2 F& @
    , t" ?! X7 q9 u. q) y; ]! |9 j距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。9 y: B$ F6 l) s* v

    7 n) C2 z9 x' X; R) a$ S1 D* g! U" w

    # G; \1 Y+ v* b" [  gKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    & d2 z% K/ w$ D2 a3 G: n8 o* E5 A' v
    在用KNN前你需要考虑到:/ c$ S9 F  c0 Q- e  V/ Q
    9 B- H" O6 P7 f8 ^+ Q
    KNN的计算成本很高' Y- u7 ?* N1 ~$ Y5 E' `. E
    1 @5 V5 H7 i" m; \) r2 @0 g# ^* y
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。3 A1 h( \+ L% Y, `6 M8 @
    & B! i3 {8 _. q' P% P3 f# j
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    # f* P) H$ J3 j
    2 m8 M; I& S) B: D) o1 B& T% d#Import Library
    # d. F* c* z5 _% q" ~4 R* M6 Yfrom sklearn.neighbors import KNeighborsClassifier
    1 }0 C4 V/ k5 }& D( x6 J! n# e; e6 s
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset- I4 @" ~* N3 F- [) Z! c4 h, \
    # Create KNeighbors classifier object model
    # V$ t) @2 g# E
    ' ~% n( `0 B1 ]; X" X2 \KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5' W5 r( O' N% s+ t+ \( d

    ' \( f! |$ b: F+ F, }# Train the model using the training sets and check score% G4 x9 W& a# p8 Y; t+ g9 V
    model.fit(X, y): G4 m  z) `. z: T1 T
    ) y: ^% z  w! ?6 l6 o9 G9 V
    #Predict Output
    3 O; Y( _2 ~6 y/ t) _predicted= model.predict(x_test)
    - i  F' q9 R8 }! T9 i7. K均值算法(K-Means)
    ) z% n& A( L# w4 v- g9 A$ N这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。7 J) l7 H: ^0 ~" j  o! |7 u2 N

    5 F1 p$ J- ^! d# T) r( @还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    ) Q- u( I8 ?  Z! r9 E0 u, Y- L) B! y- }4 I3 z0 O2 o! R) w- x

    0 j5 }+ V1 R! j9 ZK均值算法如何划分集群:
    " Y8 H! Q) s, v6 B9 c
    ( w8 K+ n: l9 w0 p
    2 x* U& r2 s8 K
    6 R4 A+ p: B  L: u1 d从每个集群中选取K个数据点作为质心(centroids)。9 i8 V" t7 Z& C

    0 }8 E2 @3 G: r+ w, X将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    4 X5 q+ t+ [8 X3 `, \% g  `. E- K3 b2 v% S' T' I$ K8 E
    找出新集群的质心,这样就有了新的质心。
    0 x7 h# Y  f* M0 L- y+ l
    " ~5 G* M6 d8 x$ m" h) I重复2和3,直到结果收敛,即不再有新的质心出现。* e6 V& `. Z1 [
    5 H9 @8 x! m) H, D* |

    * _! w- W; O  `7 x/ d7 C$ a" ?怎样确定K的值:
    1 ?% \: v9 D! x5 J, ]4 w6 {0 R
    4 N! U9 K/ t& \) D7 O( [4 V1 g+ z, T$ x& L如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。: V& t  e" i. W% k3 F5 R
    + s7 M  f  y$ N
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。) K7 B9 z7 ]$ e! i4 c; z' Y( R$ n
    ! T( e. M$ N, }5 t( u% @% y
    2 t) K2 \% r- h1 ^$ A& \
    #Import Library8 }0 b3 S9 o! i1 Z2 z! A
    from sklearn.cluster import KMeans0 `; K0 K) h3 o5 E3 J: g8 E
    ! r0 n. Q* V" S2 y& A
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    + ]" v& \' P0 X: B  }6 l# Create KNeighbors classifier object model 3 V, W8 ?& ~5 I$ }# v" m
    k_means = KMeans(n_clusters=3, random_state=0)4 g0 B  b0 w' d1 k, [

    9 O# l; _% a! g" u" H# |: X# Train the model using the training sets and check score
      z2 k: w1 @% C4 Y$ @5 t1 K' zmodel.fit(X): w# V. n: l5 R+ U3 q
    ! K5 J1 N: ?1 `; V8 i) I8 \
    #Predict Output
    : D7 O5 _$ q7 {1 w5 @% b1 rpredicted= model.predict(x_test)" z/ c5 x! C- C3 V/ L
    8.随机森林
    ! D/ H3 `* t1 a随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    1 X# M4 |/ c6 h6 a9 c
    . R# W4 s. c2 n$ o2 E$ [% k怎样生成决策树:3 A. [# d! f' _% u+ _7 e  T5 N

    9 m8 a3 R0 D1 M% H5 x5 {8 E如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。  s. `9 ?, Y6 k  M/ N0 e( h
    0 J" n8 e* O  g/ b% ~
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    : U" f- R2 A& [9 \
    3 a1 Z1 ?5 f3 {9 \7 N: n9 ~) W5 @每个决策树都最大程度上进行分割,没有剪枝。% ]3 c- ]% ~. i
    # g8 K( _+ R% F: l6 n
    #Import Library; C5 ]; [/ s; ]1 o* r5 ?
    from sklearn.ensemble import RandomForestClassifier
    ' V( r! V, z0 L$ ]$ t#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    $ t+ C: o( |" `4 x1 r4 f: ^; g5 Z3 l0 }: o& d
    # Create Random Forest object) y/ j* b' r1 x" Q3 u! a9 O6 ^
    model= RandomForestClassifier()
    - n0 B- Y7 l: u+ s5 Z. o& V' j: w4 m2 h2 m- H# D1 K" u9 G/ I# l
    # Train the model using the training sets and check score, X. s' w7 D& @
    model.fit(X, y)
    - B6 X/ H; l2 ]$ G9 y! B/ X  ~% a" T: s: i* U+ Z
    #Predict Output- U! u' D* ?8 }, F
    predicted= model.predict(x_test)
    ( a) ?- F# D' n& y9.降维算法(Dimensionality Reduction Algorithms)) t/ I$ Y( J+ T9 r
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    2 h7 x0 ^9 F/ f9 a9 g  I8 b) k' f5 i
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    ' _7 p) C) l# K# W" D
    : _. {2 a; h, @" _" F2 Y% U作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    + I. p" r* G4 x% i) ]( a# M
    % k* u& g) x: h+ L" q- L* Z/ c- G6 v
    / r; @' O9 L: a#Import Library
    " z( f" S# z7 i) c) \6 xfrom sklearn import decomposition
    : I+ X" X' A$ j6 k) C. x% U0 B/ o#Assumed you have training and test data set as train and test
    $ Z# Y# ^" D) Q0 j# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    ; g0 x8 s2 b* L+ d! u# For Factor analysis6 l  ~  e: s% z% H
    #fa= decomposition.FactorAnalysis()$ Y% R+ v+ \/ c6 y
    # Reduced the dimension of training dataset using PCA
    0 \7 I7 a# j7 H1 p. [. X" q# ?5 v$ f# x, W% o3 B* X9 }$ K
    train_reduced = pca.fit_transform(train)0 e/ P& @. s! D9 k" j
    ' Q% g: w& T4 q2 e1 F, g) p
    #Reduced the dimension of test dataset
    6 D0 j, t$ Z( z* ~- P* u  ^test_reduced = pca.transform(test)
    ! x1 c& P) |* S3 o/ x( n10.Gradient Boosing 和 AdaBoost
    2 e  {1 `5 f- f0 z6 p# u' ~GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。$ U! S: ^! D5 t3 [. e1 p0 Q

    ' h- w5 r4 r$ V; f/ }! U#Import Library/ K% T$ @) |  o, ]; o
    from sklearn.ensemble import GradientBoostingClassifier( r7 k2 }9 x5 G1 v3 t
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    * U* Y, G+ ^. H0 _# Create Gradient Boosting Classifier object
    ' A6 b( {  j+ [2 g/ I, jmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    * j; |2 C. h( t. l! i3 P  w: g: Y' z; Q7 u
    # Train the model using the training sets and check score8 J* [/ G* h* S$ E  U
    model.fit(X, y); G7 l, M& i9 S4 p6 m+ P' B8 x
    #Predict Output
    + j; `4 u( g4 k; V/ ^! i- r0 G" g$ G9 Ppredicted= model.predict(x_test)
    : n. g3 n: i  d& j; l, @  gGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    % F1 q4 Y% E1 U& f$ }6 S. }8 m! S
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386. d1 G) Y' o; A" C3 t. `
    ————————————————
    ! V6 i" {' R% O: L5 i! M; R% }: u版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' d- ^! J9 C$ z9 x7 I+ e. i原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    , S% C0 ^0 Y3 i& O1 S* a
    - W# T( u  ]4 `! _+ w  U. ?0 l  t( R! Y7 a$ u6 B& w
    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, 2025-5-15 12:19 , Processed in 0.443544 second(s), 50 queries .

    回顶部