QQ登录

只需要一步,快速开始

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

    - [6 K/ E8 Y) F  z6 L  X机器学习算法整理(内含代码)2 Z" E1 q' m- A# ^

    ! l; q7 h' g. K( a2 [/ b- n$ d一般来说,机器学习有三种算法:3 i( w0 I+ z* c
    % e. V1 F3 R# ]3 Z5 b/ A( P3 t
    1.监督式学习* B+ x/ R$ H8 z/ X& Z
    ' w7 q& E% C4 i. L8 r4 u
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    % G! r# V# T' k% p, n( R0 s& ^& b$ @8 u
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    6 {5 w' S5 f5 s9 b% o" ]* F* r& s5 b2 h' g
    2.无监督式算法9 R8 A  h* P3 X/ q: K

    . k5 T1 ?! `  k9 S无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    ; \6 i. Y# |: o# P) v
    8 p4 E- v# {3 a. T" ^2 Z! x属于无监督式学习的算法有:关联规则,K-means聚类算法等
    5 z: W& Q# q( g6 i4 ~5 e% V9 x+ y/ n9 [8 T
    3.强化学习
    4 W$ c, b& ]6 @& m2 H1 X8 ?7 ^+ A% \0 h3 s3 W$ L- f
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    ' Z/ ^9 B, o# k8 i0 r3 k& w7 f+ G7 _0 r+ p( C2 q3 s4 F
    属于强化学习的算法有:马尔可夫决策过程. J. z; }/ W  v9 j
      N  w0 o& r2 r# f" G- f
    常见的机器学习算法有:' @" [2 R" Y1 {
    ) \4 M+ {( T8 c; |! E& ~

    / y( X" \- ?) {4 U! |0 Q! H' s1.线性回归 (Linear Regression)
    ) c* \! \+ x, Z/ Z+ ]5 ^( J
    2 z2 F/ Q1 ?/ d) o! x2.逻辑回归 (Logistic Regression)0 c9 q6 y/ g, X) U' y# s8 y3 J' S/ v

    - G/ c* H" ]9 i& h) o3.决策树 (Decision Tree)
    + }' _3 ^; Q. a3 ]6 S! z# m
    7 ~" F9 t5 k, t  p- U3 k. K5 n1 E4.支持向量机(SVM)
    9 k& N  C1 D  _" h; S
    7 S* ~: s4 K/ N0 p, t5.朴素贝叶斯 (Naive Bayes)
    9 }( S! p9 N& Z, ~- H$ X3 q3 F6 Z9 S% _4 Q, r
    6.K邻近算法(KNN)
    - q' ?# E3 ~9 p7 K; T* S0 z
    ! ~/ S& h% L  P+ u! [- k7 ~8 J; R7.K-均值算法(K-means)% E, W% S5 \' A/ z4 F

    % ~' O% |( L: a# M( _- N* p% z8.随机森林 (Random Forest)
    4 N) _  P2 k) \0 {" m+ V/ u+ G1 X8 D: e, g4 Y( N. W
    9.降低维度算法(Dimensionality Reduction Algorithms)
    0 y. B& E9 J; c3 o
    ( X7 f* z% u- v8 w$ a( ~10.Gradient Boost和Adaboost算法* y, ]9 v+ _# d& Z: a0 i" V5 N* `
    一个一个来说:
    . \( y4 c4 ^- S0 R& b8 F1.线性回归+ a: h# m% y7 Q2 v1 \

    * g" D1 }$ n% S( a线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    " ]' r/ a2 ?7 c6 M$ O# K6 T! j$ b: v
    在这个Y=ax+b这个公式里:
    % d5 q& x0 F+ p, Q2 U2 f, u: b  p: L  i% A: y
    Y=因变量) E$ C* K- o* j& Y# ]- H2 B

    ' z9 a3 r4 B" |* D6 x1 l+ r6 V a =斜率8 E# H" `# S% {

    , z# @$ D! W7 H0 ?# @ x=自变量
    ( B/ o6 u2 \: J- I1 P( ~3 q
      S$ i5 A2 U5 Z& [% s" [ b=截距
    & s- O+ H1 O% l  u) X' R5 `7 r
    # n& |, x) k8 U& C8 Q$ P% s a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    1 q6 a" o) x0 x9 [5 O2 c+ q
    " g, H/ j# c9 m5 p1 r) u$ C" c我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    ' c2 X& z  {1 l; g: g. s3 a: k) g: |) `- _; p
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    3 h. \7 ]" H4 J$ y- ^7 |, d% L% N2 R3 ?- C& W3 f
    - Z0 C) a+ z3 H! }  @9 w5 t

    . I: W& N6 l; D8 ?线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.- ~# B& G! V4 N4 N" k! r
    ; e9 k2 j+ _/ v. L1 V5 x% X
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归# D  t" Z; T. I# S# o) h' F( q

    0 L$ R; S+ R. P: Q' ?. Y- P/ mImport Library, z. L3 `  t, N, L* G& R( D
    from sklearn import linear_model* ]+ L7 t. v4 o2 h2 W
    7 e% m7 V* i+ m  `$ p
    x_train=input_variables_values_training_datasets5 ]/ T. p  i! n- s
    y_train=target_variables_values_training_datasets
    3 L2 |5 ~, E- E5 G9 \3 W( I* O6 ]x_test=input_variables_values_test_datasets, V. ?) V/ G# a  L$ f8 v2 s

    ( L) W* h  G6 x0 p# c( ]# Create linear regression object; J0 {; \4 Z1 N, M3 M
    linear = linear_model.LinearRegression()
    $ q% a3 V- S5 `+ ~2 d
    0 ?  E, I7 t: F+ o( f; i# Train the model using the training sets and check score
    1 I# d% n" O) wlinear.fit(x_train, y_train), L$ J5 F8 k$ j  T$ x
    linear.score(x_train, y_train)
    $ q* V& l  r7 Q2 g# v& y$ A) Q* a4 W2 D/ H  Q
    #Equation coefficient and Intercept/ G7 ]  h* D7 I* B7 q$ z
    print('Coefficient: \n', linear.coef_)1 z3 V* c5 s$ T' `
    print('Intercept: \n', linear.intercept_)
    : a$ t& l1 A- |* P% k" s! w
    7 X5 S+ r/ Z, A  u7 A2 Q#Predict Output
    . u& l) u4 I) @$ Q. k+ w# j9 ppredicted= linear.predict(x_test)% C' [* n$ U/ g- @' h$ t" j1 p
    2.逻辑回归5 K5 F& @/ f) B0 H: `. m
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!/ b9 N; B# l: a* a* ^3 ^4 }

    . T+ E6 @* Y9 {/ p! \/ t同样用例子来理解:1 l& o1 a5 T& P& Q
    / c2 n& t/ S7 h( ]! B
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    9 u5 W, z6 v' m, W! o9 ]+ O6 P3 J
    ' e% f1 }6 V4 `' e2 c: \8 e5 k数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧2 S, F7 F0 x2 h/ g5 y* ^( I4 A
    ( N+ C4 R  Z, [( Y
    最终事件的预测变量的线性组合就是:7 S1 d2 R8 k8 c. g( ]$ Z
    3 }- G. ^: |# G6 [6 s

    & h5 A9 o( X8 Q, U7 V" W3 ?odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence4 J* J4 [1 e# O3 }# s, A

    ! q9 u" G) ~2 _; F  S. dln(odds) = ln(p/(1-p))) t# F" h4 U& L0 `
    & {( F# j: u5 e% i* `$ r
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk4 P( i8 r/ Q  b+ @) H# Z  ?
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    , Y1 Y/ V$ I; h9 C& G  ?9 L& e& h6 m3 m3 r8 p! N: ^3 w7 z; p
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    % |6 ^4 W8 @7 d3 `- b
    - S" q% Y( v( v- q  y; h* Z" y  r7 O) C9 E5 G
    ) [  s) B' O+ U; ?' d8 z
    from sklearn.linear_model import LogisticRegression
    0 r6 x3 Q4 ~2 l& n) Q5 ]
    4 K( O4 R! i/ D8 o) J model = LogisticRegression()* t# O" t+ Q9 k, K8 z+ Z
    9 B( t. F( M% W. [6 `
    # Train the model using the training sets and check score; Y, n6 e# P! d6 T6 R
    model.fit(X, y)
    ( b. q5 [' k- d+ p$ e model.score(X, y)
      J7 b* b  x2 ~$ d4 |8 @1 }4 m) i6 ?1 m9 C+ @! C) Q
    #Equation coefficient and Intercept
    . \4 E' y! \7 ^/ |$ z/ P print('Coefficient: \n', model.coef_)
    6 P/ J; L+ Q4 }. \ print('Intercept: \n', model.intercept_)
    - r# J; Q% Z/ l; U
    $ T/ l. s/ f  D/ a" `% m #Predict Output
    , Q; k# {/ c, f& O) R6 g) o' z predicted= model.predict(x_test)
    5 P" h3 G" `! }! @逻辑回归的优化:
    : k' d4 z% }, v2 X加入交互项2 C' R( c  X) Z# S+ r
    3 j: x: l: d. P! [" _9 _" t
      减少特征变量! |5 j& o; T) g

    9 d; `+ o5 s) f' T. d  正则化. Y' G( R! ~! K

      R$ {3 j* P- p# ]2 Q" _0 s  使用非线性模型
    . M) p: g, D3 s! o3 I! K2 h5 K1 D$ K" {
    3.决策树+ N; `# l" Y$ t( o0 x$ _
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    # Q, ]5 C! t1 q+ x* U+ K/ l8 E. B$ @( R  y5 O. |+ v

    $ m( K0 L& _) B/ @$ I$ }0 I! d. i
    ( F. Q+ ?# ?3 y4 P; G" M( @9 T从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。% H' ~4 _  T% Q( ^6 x

    8 P% e5 n0 ^; v* I& Y+ ]7 d9 s' Q  z* K& e1 f: c) x
    from sklearn import tree
    ( K1 x6 t8 }. \2 T# u
    4 ?; N9 N( g, A0 k$ j" W1 `" c/ J
    5 t. S( B3 W3 W- R0 x# Create tree object ; U5 j6 L9 \& B
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  5 s/ F5 X- \0 B+ W

    . k$ s5 O! M) m# model = tree.DecisionTreeRegressor() for regression; Z, E1 E2 @8 D+ K- E

    ! d3 F# ~- ~1 v# Train the model using the training sets and check score4 T6 t2 y8 [$ `4 K
    model.fit(X, y)
    ( p. z) K: ^% _2 `) ~' Hmodel.score(X, y)% W$ d% Y* U- Q

    * ~: K7 N/ ~/ i# R3 P' N#Predict Output( V' ~" u% ]0 T' D3 Z# m
    predicted= model.predict(x_test)
    5 _  e' q3 b% U6 G2 T0 e, D0 N4. 支持向量机(SVM)
    ( V  Q4 M1 o& X这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。) P' u8 l% ]- g( X6 _
      j0 K% U# e7 u' d
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。7 _4 f% G8 V0 c$ S0 _* i" w
    2 {. R. T6 U4 I. C& O* H5 b
      ~/ T4 R) b8 a1 R7 a) I1 H* S  q

    % {2 E( E( s' M1 S3 u在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。9 W) G* r0 H# [( c. |$ @

    7 p& B9 F% x3 T/ t#Import Library
    . z4 {+ _* S9 Z: ^* d/ k8 mfrom sklearn import svm
    5 S$ v2 Q1 d3 H# M3 h+ P' Y! S#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 k4 x* [- C& ~  i; c) f& g0 f, Q
    # Create SVM classification object
    - E' O$ N2 M+ x0 @; K4 s  a! O5 a7 [- r( [  {/ s$ u
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.& i3 `, Q" a8 K$ ?" s$ O
    / |3 I* j4 [8 n3 P
    # Train the model using the training sets and check score# H/ }, i- r2 u/ Q
    model.fit(X, y)
    - o+ u, p! _# p) |: Qmodel.score(X, y)
    7 w/ M- ~0 c" V
    4 }# t) B* ~0 U) |) G# r#Predict Output5 {9 {/ _3 J, p8 h& h3 y
    predicted= model.predict(x_test)
    ( L" Z! t$ u/ W5. 朴素贝叶斯: }' ^% a* g: O; u. B: q' `
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。& `8 e$ z- |/ G1 w9 G# T( C
    7 _7 a4 S+ `1 H
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。% s& a% k1 h3 W- m( v0 ?! M8 V

    3 T' n  {$ ?  Z2 C- M0 o3 d贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    3 x2 L3 F# H. A1 Q( ?% }
    ! a& \; E1 k2 x6 p7 @; g' ^# p
    - u- k! B7 a! n5 |) y! u9 M. wP(c|x)是已知特征x而分类为c的后验概率。3 Q3 s1 n4 o, q+ o5 c) j+ |  s
    4 S/ @# Y. W1 b% X$ [& K
    P(c)是种类c的先验概率。& k" p4 r/ h: C* `

    * W4 y! D9 P. j: `P(x|c)是种类c具有特征x的可能性。8 t9 B. u9 Q! e* M. a' `

    . c6 r, `! u1 }0 }P(x)是特征x的先验概率。' }& o$ |' V7 ~
    * f* D  t- V, a( k( G  e) w' L

    6 x7 q: ?5 {/ w1 r/ I- H例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:! Q( c% _) J2 B8 r. x

    . L* H4 K* v- Y. c% B0 ]# A, x' K' O步骤1:根据已知数据做频率表
    8 \, W: L6 @& I7 v* {! d, |+ r0 y8 p0 q
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    4 ^  A- H4 S6 t/ [7 L
    ; `# o" B5 d, |) T+ c
    , _3 V) j" v; Q6 a1 y步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    , l1 q- K* e3 J) c: l1 L提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?; [7 S  ~3 |1 c2 b- s5 \; c
    7 e, |: w8 U2 g6 r/ @: ^) F3 j
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    8 }4 o* s+ r/ b- u! q3 @2 x+ \9 Y
    7 A7 n. g- r' H2 Q7 X4 D: P2 H这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    ( w5 e( x- e1 [1 ?+ }
      F* d! S2 H, E) E7 ?2 h7 P那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。2 M% h3 W. {0 @* ~2 q

    ) B* r( r' r5 z" R( j  N8 \/ y当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。3 [( ?' }1 g6 _) U  P0 b8 _, a
    , v& N! p2 E8 T/ R) ]! Y
    #Import Library3 k+ S/ h$ l, W8 k6 S3 }( E+ M
    from sklearn.naive_bayes import GaussianNB( ~) x; ]# E. ~3 a0 W
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    + @0 B3 X" \# n  C2 A' U  ?) X8 W: P* E; R0 |
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link" S) ]1 T' \4 K5 z& J4 \9 o

    4 B+ D$ [5 K; \# Train the model using the training sets and check score' I. X4 x* \1 z7 x1 |' B+ {
    model.fit(X, y)3 i- h4 Y7 V; g7 q( `* h# x8 H# ^
    0 x  ~) P1 n, N, _5 ^* c
    #Predict Output- |! b; @1 g/ q( v3 K
    predicted= model.predict(x_test)7 w; t4 u- ]4 Y$ `2 ^+ |
    6.KNN(K-邻近算法), ?4 P9 {6 W+ j) ~6 Y5 w/ q
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。/ f! C1 U/ o& K2 B

    # ~+ D  J1 k% ~; n, b距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    - K+ V6 H' @) w  a+ l" \% t7 K+ A
    ) C5 X9 U. N) G- g( F, Q. H
    # R% s5 b3 ]' A2 V$ K1 K0 j  u( `5 P6 ]
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。; |; ^3 x3 k# t) Q1 \
    ! `' D8 J2 N" V
    在用KNN前你需要考虑到:
    * |3 j7 d/ J3 ~! Y8 `( E  f  f  m0 ?9 P; k- K  f% I
    KNN的计算成本很高
    : d) k1 f1 W; \3 P" U
    & ~! W. {/ o8 L5 T$ U所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    ! a1 e  |! l0 b* Y
    $ h$ ^, N3 T, s1 k& |在进行KNN前预处理数据,例如去除异常值,噪音等。' V3 I7 w  I; d$ n: }+ [0 H/ \  {

    % Z! M: _( b+ ]+ M; }#Import Library3 v( n9 k" z, B' v0 Y$ ^- A% H
    from sklearn.neighbors import KNeighborsClassifier7 j' p% d; [8 p8 z1 z
    5 g9 b% f" m& x0 b3 ]% R& X
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    1 @% m3 Y9 J; ^3 ?7 J- _/ J# Create KNeighbors classifier object model ( w' H+ K# w. I; F/ L

    6 M# ^/ ^0 S' mKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    ( A; a4 t2 I/ l- T
    3 b( ^7 c1 y5 J8 V* ^: y/ p! l# Train the model using the training sets and check score
    " F- h/ Y: ?, w4 C) Wmodel.fit(X, y)
    % r3 I* g* P- A) S  j$ K! g; f1 e: L# R4 V+ X" T
    #Predict Output! Z+ [; d# s1 q2 f) i- L
    predicted= model.predict(x_test). b0 T, A3 a. Q5 t7 f0 B- b
    7. K均值算法(K-Means)
    : D/ K% X5 F# G这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    ( j7 v  Y' ]9 n3 Q3 a+ x! h9 C& \( P  e1 Y8 d7 R
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!: i0 ?- J/ B3 i; k

    - e! P  _2 D/ U# h; r" P. j( K4 }: X8 Z% l
    K均值算法如何划分集群:
    9 z9 L- m7 d6 T9 ^, @# @( v$ \
    * F1 [7 f' ~6 s3 T$ L. |, p. b! ]' w- e
    3 S4 A5 Q! Z0 {, `! r: P! E
    从每个集群中选取K个数据点作为质心(centroids)。
    0 y$ ?/ {, W7 h/ \7 l. c' R( y1 Y
    $ w+ J7 U( Z" ~" E- C将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    7 B9 `  n% d  U2 O
    # J( X4 |+ Z4 z- D8 G找出新集群的质心,这样就有了新的质心。
    3 f$ S: b  O9 A, i. B/ o& d: t9 R4 {3 L( L( V' H4 v7 |
    重复2和3,直到结果收敛,即不再有新的质心出现。
    & F4 f. }, O* J* z9 A  K! v+ t; {6 G0 J+ ?6 ?

    + X3 L: d, L" W7 M% m  ]怎样确定K的值:
    7 X( t3 l% X' f9 G: p! f9 O5 W5 Q
    ( E/ ^( f& b4 s9 x如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    " J. E$ d4 y. u2 y% ^8 h) o" B; X  C0 Z! U9 z9 ?  K5 p
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。1 S& q2 u3 D: F8 n0 R! @  \1 X
    % Z2 K, J. E+ P- Q5 z( O! b
    ! W  D1 T/ M1 e) v
    #Import Library
    8 k3 N- ~, n  W# C9 L/ y5 `from sklearn.cluster import KMeans
    1 @7 B6 p8 f! c8 x% N7 p3 \
    % J4 ~. X  T! u2 y! U6 k8 T#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset  j0 L4 d1 ^2 e: I
    # Create KNeighbors classifier object model 0 w; U) n+ O, K  e: }
    k_means = KMeans(n_clusters=3, random_state=0)
    & I9 p! T; v" W6 }  k, d1 Z4 L- w3 B. {# y1 Q  X
    # Train the model using the training sets and check score" H1 J- K6 F! R, K8 `3 J* @: S, v
    model.fit(X)
    $ s: e' s( c& g$ c* e
    - Z# o4 k  w1 N* O. ^% f7 p#Predict Output
    , K2 {1 _% {& k+ N8 h  \predicted= model.predict(x_test)/ v- p5 o# b, x$ [7 I- n
    8.随机森林
    . W0 Z+ D3 {1 N4 u% p随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    $ r# r: Q1 P" P1 U) a4 c; \
    , Q" j, D1 U4 _0 T怎样生成决策树:
    * C# ~# `: S. }. q
    2 e7 `! G: M2 T如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    - S) n$ r" X% `. Q) F! ?
    ' t$ q- r% {% k$ Q& B0 q* P如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。# n$ E* r$ N$ u! V

    ) {; G7 {% q# T1 ^+ U# l每个决策树都最大程度上进行分割,没有剪枝。. f9 i& L' x  J4 x- [4 ^( n

    * q; j. A$ D- `* v4 s7 k2 g, `#Import Library. z! S( M7 i9 u" E. k4 l. O* |
    from sklearn.ensemble import RandomForestClassifier. F! I" o6 B8 p' C- N0 h5 a/ s2 u
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset  k; b0 N5 k) M/ p! ~" q9 A
    & k1 ?3 ^! I/ d2 g
    # Create Random Forest object0 `/ T+ v' h( ^$ d. }# M
    model= RandomForestClassifier()
    : A: f: l& g2 ?: g7 d2 p) i, W3 h) T2 G/ C
    # Train the model using the training sets and check score
    5 O  `/ a7 @$ J% u" k7 C% Pmodel.fit(X, y)
    & E7 F- ]6 }8 ?5 `/ _0 h
    ) L1 G6 F% ?! e' X/ g: s& n#Predict Output
      A/ n  z3 f% e3 T8 upredicted= model.predict(x_test)
    , t- B, V. N: C& p- F) g9 n0 r9.降维算法(Dimensionality Reduction Algorithms)
    2 f6 F9 @$ \+ T$ |% s1 q在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    ( n, p& L5 `3 x! S
    8 K: J' r/ u6 i/ S# r, B例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。2 T' s  x& N% j' O
    7 L8 k% F# t4 B
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    1 B3 c# B( F1 q% T1 O- K: e$ u, w! {) w3 C: o6 t+ ]8 u2 e/ L, y
    # T8 w* ?4 o+ }& a5 M5 E3 I  E/ w# m
    #Import Library& S0 a! j6 `4 s' q
    from sklearn import decomposition
    . G+ \; d5 _$ _8 x! L' D" R" R#Assumed you have training and test data set as train and test2 v( _/ I' _2 l
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)* t- {7 t1 g( ]. C, D# v
    # For Factor analysis. c, T* z# C* N- c
    #fa= decomposition.FactorAnalysis()& p, {$ M: t6 d/ b+ ?( P
    # Reduced the dimension of training dataset using PCA& u' H* h6 d) S' @6 [+ b1 i
    0 w( L+ ~# ^  g4 y" N' |& w) H+ {6 u) s. {
    train_reduced = pca.fit_transform(train)
    ' a( `& ^7 ^" V
      G" a: A5 t9 ^2 G8 h/ o#Reduced the dimension of test dataset/ |+ ~5 k5 x- I
    test_reduced = pca.transform(test)! u: R' a2 Q. h; Z
    10.Gradient Boosing 和 AdaBoost
    . P2 F$ Z* D! [# l2 L( f8 wGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    # k/ c' w" i: ?; n0 @" `) n0 I3 C1 G9 w4 D3 {, l9 k+ ^/ |# |) n
    #Import Library" E/ M5 f& Q7 f/ }$ |* e3 _) i
    from sklearn.ensemble import GradientBoostingClassifier. h; c! E  I. Y' I- U
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    2 R" ^$ u) t7 _0 Y1 S7 ?8 L/ g5 {# Create Gradient Boosting Classifier object
    0 r/ M& \5 \) I  O' b4 i8 nmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)$ x; E: Y( Y$ _$ k; \
    8 u& q0 B) [' _4 }" A5 W/ W# _- `
    # Train the model using the training sets and check score
    + C% W& p3 X* n2 x" L& k% tmodel.fit(X, y)
      G, q* u  Z2 r9 m( c#Predict Output
    9 z4 D- z0 t& L( X* o4 Y7 Jpredicted= model.predict(x_test)
    , a( X  o7 F* ?/ P5 w% _% K2 |GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    . ]- I  Z5 {) z8 N. o% ]8 @8 Z
    ( `  w1 ~1 t) ~4 Y+ B$ T原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ' G8 l8 _' q9 O! w- x————————————————
    5 z' S" L: E, C3 u+ ~+ O版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 l9 A  v/ _# c0 F% h  ~9 P; \
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075! n# c1 Y( i7 O  t

    2 t0 ?, X7 b* }! r( x% S- h/ i' Y# T+ G3 N
    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-4-20 00:11 , Processed in 0.408451 second(s), 50 queries .

    回顶部