QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2271|回复: 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
    * J: P1 ]1 M5 `) a' M- d& W
    机器学习算法整理(内含代码)6 S3 t  }9 Q/ Q, M
    1 K0 f: P6 v* p4 E: b9 v$ M  [$ }
    一般来说,机器学习有三种算法:
    4 h4 w3 `# R$ Y3 z: ?7 [! a4 }/ Q( f( |2 Y! L
    1.监督式学习
    1 g% Q! p( V% ]+ ]8 l3 l7 t. c4 M/ x; A: ^% m; V: N5 L
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    ; M. O5 R- Z5 q. K- @; F# @6 e  x' g$ t$ r6 \! v$ w$ r6 o
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    2 i! Z* |* r" \2 {, x- L3 K' X8 n2 {; q0 Q0 j
    2.无监督式算法
    " G/ |$ q9 p7 O( a( n3 c( Z2 g
    8 |6 @4 B1 Z# G; d" o+ r9 L( u无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
      m& d/ q9 q8 ]& k0 ^( J
    & t# {& i- z5 P( L7 A6 p0 Y属于无监督式学习的算法有:关联规则,K-means聚类算法等
    ; \& O1 C. Z$ B% w# J, E
    $ ]3 B: g& B. m: ^& X  E3.强化学习
    * o" u0 T# {: s  n+ m: I; ]1 k  H" H/ ?/ w2 M- F* C; @" u
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    5 N, D8 U/ y: y2 c7 |" m( b8 [" @" o9 \/ y5 N  o9 ~
    属于强化学习的算法有:马尔可夫决策过程
    : k+ F3 E1 q' b. r1 Y" ?1 S1 K
    常见的机器学习算法有:
    $ V2 r& K% ?- J% M. i9 w. l! r3 E+ \" r4 |* m+ T2 o6 {, p

    * C" B$ r& l& q, P/ N& W: g1.线性回归 (Linear Regression), b: U9 A4 R# `8 z

    - o! l5 F& V# K" a4 N2.逻辑回归 (Logistic Regression)9 b. s/ f& O. I, p% r% ?/ W

    # c* g) B" G2 d3 f  s% B6 m3.决策树 (Decision Tree)! [+ W; l+ I% P/ f  x, N' M
    0 t6 T% m8 a( E& ~
    4.支持向量机(SVM)
    4 u! G$ n2 O' H& S" b) E3 n6 q4 R4 a; J, H( W
    5.朴素贝叶斯 (Naive Bayes)) ~. x6 l. f8 Y( K- d
    * [+ a8 X8 n1 p
    6.K邻近算法(KNN)
    * i7 m0 C8 |1 B2 P1 g( m& ^: i; E( c/ Z. u
    7.K-均值算法(K-means)
    ! A, D5 S/ e% E+ Z* ?3 m6 d7 d! B* ~8 H  z
    8.随机森林 (Random Forest)
      I; q: f* _& w' g2 L9 i, m# L# r: l9 Y3 D
    9.降低维度算法(Dimensionality Reduction Algorithms)0 W. Z! A5 a2 O) ?! }
    4 E: ^' j: o! `0 U  V1 g- @
    10.Gradient Boost和Adaboost算法; o( Q; c" ^" |, D7 N+ k
    一个一个来说:
      I/ i' O3 n: x; h1.线性回归: l0 B1 d; W) H+ a

    9 B" [9 H) V' ~$ m! Z) j' i: c. w% g线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    " Y; e# x* \3 U7 J6 V/ D$ ^  n: ]% \6 c7 J8 m6 `+ v9 \1 G+ X
    在这个Y=ax+b这个公式里:" [/ F" E; U# B5 ]

    * `+ T# W3 h8 h4 S0 o0 v* K Y=因变量0 {* R" R3 x/ ?: V# z+ h
    * z0 l' @* X7 }6 Q; M; y" Q$ S2 U
    a =斜率
    4 \1 e: S% D$ X2 \5 i5 e) t4 V' l! @" ]0 Z5 S
    x=自变量
    + K8 O$ Y0 L0 A2 f* a8 m
    9 w% L4 z2 ?6 s8 m b=截距
    . M. [7 I  n% J2 V, A
    # C! M9 f( |  H9 Y: `2 y a和b可以通过最下化因变量误差的平方和得到(最小二乘法)9 ^* h0 ~' U$ O% i, p
    : w! e5 |7 l; Q3 Z) c# `! C4 b
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。: e: G: D2 y, s: z0 e9 Z0 l

    , g. o% a  k! q( ~3 g% ], {& e9 j给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    , j% ^9 \2 {& _" ]3 A6 u. N$ P% c- M0 |# e4 \. Y( ^& Q; {" q5 S1 @# i

    ! R6 ^* D1 f7 R' u2 Y5 x6 R, i/ m4 P( o! X! u  v$ g* o8 H
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    + {4 Z8 C: o7 ~0 Z. U. H  r+ P/ m8 Q5 C7 ~3 _; n  L; X: e5 m; h
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归& h) ?. ]+ w( L2 X

    * |2 V0 p0 s% F2 f3 xImport Library2 y+ y1 U/ `, t2 w- x
    from sklearn import linear_model& Y+ f9 y( F2 n) q) _

    ) F% s9 ~- W7 ox_train=input_variables_values_training_datasets; P& c, ^4 p! a' ^* G$ s
    y_train=target_variables_values_training_datasets
      `- r5 J: ~& C! p. i/ ox_test=input_variables_values_test_datasets: W0 z. g* O: v1 h
      A# g, A7 w/ b1 m; U) d
    # Create linear regression object8 o; Q: T1 e& m
    linear = linear_model.LinearRegression()
    9 d! N7 C8 Z' _  C: }
    0 v8 L4 ~# v: |  g0 L. J. b# Train the model using the training sets and check score
    % K0 M  P: U% i, |0 l6 {/ Elinear.fit(x_train, y_train)- {1 t$ R4 N+ Q
    linear.score(x_train, y_train)
    5 d- u: m2 x- A9 m! ?- y' o" l( b, T, E  N
    #Equation coefficient and Intercept* Q4 ~0 X: I$ n4 o$ Z: Q
    print('Coefficient: \n', linear.coef_)
    6 k7 g: C- ^, E% vprint('Intercept: \n', linear.intercept_)7 p  I5 O+ @+ l$ h  _

    4 |% A6 w) q" x6 o2 _; ?) U#Predict Output
    " K5 _( _; Q' z7 T; k" ?predicted= linear.predict(x_test)
    ' V8 p! u: d& F6 D2.逻辑回归6 g3 Y/ x& s  U; m9 h) [
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!- I  |" D, k# V1 d- I/ x

    8 @8 q1 [% ?" j4 V' G: x# U同样用例子来理解:
    2 n2 H) ~8 {- q* x4 J
    7 p+ N2 D: ], }! T" Q- |2 Q假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。" U6 Y* f/ L- c
    ; D' y- D; T. u
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    6 A" n1 O! X% o; O' q, y9 |0 u( A' t( r6 D
    最终事件的预测变量的线性组合就是:
    5 t; ~' t$ |! ~$ G
    5 N) J$ Z* J" \" W" i3 Y7 o6 O. H' v" R: r+ b$ g9 [  Z
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence# |1 [! Z1 C( z" p

    6 X( ?4 r& S9 L! T5 Q( q# P: J+ ^ln(odds) = ln(p/(1-p))
    . T( a7 Z/ P  Z3 s8 S, a$ a/ d$ d; ]; V. w' x
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk% J/ v! ]6 C; ~* E* l
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.2 W, S! H- [. F5 I( \; Y

    . Y7 j- B; ?5 q! f0 `. l0 S至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.+ z) b- G; H, I# I' z

    ( Y& a; Y) {* r! P1 _# G( F& d& d% d% y- l+ }. L! F/ A
    ( q/ ~; |' O, I& {
    from sklearn.linear_model import LogisticRegression
    . |+ Q1 E% w' F9 ?0 t; |  H+ q, [6 R" l. F6 o) U/ G, V$ G) q
    model = LogisticRegression()
    ' |- c, E6 X5 f6 U( [7 K
    3 w0 g, R, C( W% X1 z6 v* _. B # Train the model using the training sets and check score& D& H8 v0 |7 D4 w, ?: Y' i
    model.fit(X, y)
    0 f+ W) a8 B3 z9 Y+ g  }! H: ^ model.score(X, y)# t! M3 |2 h" T, q$ V7 |

    ! y4 v8 m* }# B1 H, M$ a #Equation coefficient and Intercept
    ! ~1 }- O) h$ U8 e' f* @ print('Coefficient: \n', model.coef_)
    " U* n  W/ N9 Z: M- i5 m' @6 H print('Intercept: \n', model.intercept_)
    2 `% }# b; n: h
    / b# T# v' `3 M/ L1 P( E #Predict Output
    * F' w2 k4 f2 d predicted= model.predict(x_test)
    . ~- Z, e7 g5 ]# M( N! r逻辑回归的优化:2 L! C- H7 c4 [' Q8 c
    加入交互项: W$ P* `& D9 O' X+ c, {7 h  Z9 v
    + `6 O9 h  G7 w( h6 d7 L) w
      减少特征变量+ ]8 `: P- ]& T" ~+ m

    " M* \- {+ u" N& ?5 K3 R  正则化
    / \0 X& d7 K# F: c! t& j8 U: N
    , J; ]4 {4 t- b& E: `' [2 E, ~' ?  使用非线性模型
    3 x3 E) ~6 \1 y  L# v
    " E" F+ {3 b! x. T3.决策树5 U: R0 S+ R! \
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ! g: T" m; J" ]+ J3 L, Z1 }, ^/ O# S8 |
    8 h; |& E  O+ f8 U/ c. x3 G3 @- B

    : ?' t7 ]  ~% A4 o6 u/ J7 W从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。0 ]8 z% j2 [& M
    $ i! I) r# ?7 A/ Z& E/ r

    & K4 c% O/ f' w( i: gfrom sklearn import tree
    6 u# m; _! o2 _- H4 T' t& @% i1 q+ L9 Z4 j8 U8 [: H- q' h

    & P" F& _' |$ y6 B( A- z! M, C# Create tree object 1 D: ^- A3 m/ Z2 i
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  4 f# s/ A3 G4 d
    * P  O% r+ w5 o! F8 j
    # model = tree.DecisionTreeRegressor() for regression6 y' w5 W; G. K
    ' q$ ], w1 k1 o! ?
    # Train the model using the training sets and check score
    5 \4 Y- y( o  zmodel.fit(X, y)
    , p7 t- s3 N8 jmodel.score(X, y)
    , V' J; K6 Z- G4 e  p9 }( j
    " ?% d9 I, I5 V) K2 q#Predict Output
    / n3 F+ `! a  I" u2 }6 Zpredicted= model.predict(x_test)+ ~9 E# D. d! {' x7 \' j$ C" o. z
    4. 支持向量机(SVM)
    # Y+ ]& N# H- Z7 ~这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    ) j7 w: v5 Z$ A! W; x8 @7 d& t- w
    ; ~" F9 n, {: [! _7 ~/ K# v9 n现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。$ G: ^$ q" p- G3 v1 G- s

    2 u5 ?. c% x/ D5 q3 R* t) U5 {: p% S, i. J$ ~9 y8 I
    ' z! J* M! U; F
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。# D1 g0 R4 N+ e% j: k5 c. m; V" i
    : B- s, l( L8 M5 @3 N
    #Import Library, l% `5 D" B% S/ L2 B
    from sklearn import svm
    " F, _5 [: r, l* T! e#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset" G+ M5 o2 ^9 b  w- O
    # Create SVM classification object
    ' }  R$ T/ L: ?8 _3 N  z/ G  l2 M/ j3 _, x
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    6 Z! r1 y% f7 }) Q
    + f, C- T+ j( N1 @/ K. t# Train the model using the training sets and check score0 l. Y- @7 M- i: T- P8 x
    model.fit(X, y)
    . }/ g* b7 n5 U# J+ h: jmodel.score(X, y)7 c1 d/ o) a' q7 R) [; f" Q0 F6 N

    " j6 _- z/ b- m, J) l  Y) q#Predict Output
    * `6 o5 P" F( Vpredicted= model.predict(x_test)2 k. Y9 ~; N/ N/ R; V" ?8 H
    5. 朴素贝叶斯
    * U7 Q% g, z$ F6 C6 J这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    % r3 p9 V! }: y' ~4 P4 M# H
    8 \* q1 ]; ~) h; ?( d朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。% w" H( G, n3 q8 _4 R% Y
    / H% A" f# u3 A* i2 F6 {
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:! y1 F" J2 d, Q/ v
    4 h3 g: R) J; g
    + }) y/ I! k1 Y5 X6 v) `# v
    P(c|x)是已知特征x而分类为c的后验概率。
    7 P' n% M# }% K3 u: n. _9 ~( y& c( b( @9 z4 g3 D& `* k" z8 u. _
    P(c)是种类c的先验概率。0 }, ^% o0 G; d/ a
    9 x1 y) f$ ]4 X1 ?+ i0 L. e; b- O3 t
    P(x|c)是种类c具有特征x的可能性。, i) d. z& |4 {
    4 }9 q% o8 c* S% e4 L' U/ k# t' L3 a
    P(x)是特征x的先验概率。  ~5 d" H" B' k

    " y# y8 S; T9 I, f8 ~0 r+ x  R7 ]- y' S* R. a0 z$ B& p0 R
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:4 k, R3 e. I2 L! q" U1 v
    * ?5 t3 f8 l" b) O$ }
    步骤1:根据已知数据做频率表
    + T: L# t6 A0 D; }+ l, Z0 q$ a9 E! N" O. F
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    # Q3 t' B# c. K5 l! o! u' U% S( j: ]9 y, b& {1 j/ U, V% f% p

    7 R7 k# K( o/ a, w; r$ |# L步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。' M* t7 Q* t0 }. V* X- g. L
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    5 t4 @9 f$ w- m7 X( y' u# p% _0 z
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。0 H5 I1 j& Y& t

    9 }* r) ]$ D2 b/ A4 Z8 e$ x这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。/ [! W* D: z* H' O1 p7 V  |

    3 }3 S# T# U$ ]0 @" w: o: W6 ~8 m+ _那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。) O# }+ h3 Y! g  Y1 y# P4 S
    ; W8 a: k4 M' ?5 K2 o
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。' H2 ~8 T- |4 O* f
    2 {' S2 r7 v( E1 h! ^4 u
    #Import Library
    ' ?6 ?6 x& @/ N2 R1 n  wfrom sklearn.naive_bayes import GaussianNB: f! N1 b1 H- }, n- y
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset! c" v2 y% B, W" Q- O
    , e4 S. a8 t  y: ^3 G
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    4 e0 e  [% z# l2 F
    7 G7 |1 `! R* M( k8 x# Train the model using the training sets and check score
    ! t  j' u9 p& {' Mmodel.fit(X, y)
    % p5 y- j* Q1 A1 ~1 p& q3 S  {7 @; s  H8 X& G/ O  U. B
    #Predict Output
    ! Q; u/ e1 m9 V2 n5 Y9 ~7 {predicted= model.predict(x_test)8 e: p' [* c/ I+ Z
    6.KNN(K-邻近算法)  o. o0 `5 R, W/ @
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    ( |1 k6 e, `! @9 x
    ( ^1 p5 o3 v/ ~; ~6 ]  ?, O距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。& H! k1 a( N* C& w/ X/ U) j

    3 Y+ x2 k* ^9 |/ Z+ X2 {  D' E4 [  |! w2 k! _6 t

    8 s1 a# f4 y, Y% N5 kKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    ) T& v  ]9 J: r
    / Z' k8 x0 B0 z) X7 g; e. k在用KNN前你需要考虑到:
    3 D( O; T6 H% n3 t7 K6 g( D  a. _# k$ L
    KNN的计算成本很高
    $ E/ s- O, J1 V3 X# N. m- q" B1 @/ z
    9 u0 m5 U; K, J8 U4 ]' i所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。7 X5 e  p: G) g; N( E6 S- |
    " ^; a* W8 ~) {( u4 E- N* i1 {( b
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    0 N/ G+ H# ?* T; [1 M0 `0 G2 o0 W/ ~* N1 r6 p
    #Import Library& g% R, M% h0 [! A% U+ x4 `
    from sklearn.neighbors import KNeighborsClassifier
    % B# Z: ?' A* ~! u3 d6 e$ a3 N, X9 q0 u# h* Z5 ^: b* P
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset; ^# m+ f( t" k& B
    # Create KNeighbors classifier object model
    # N4 T' x7 E* v8 X: x) H8 _7 F# Z6 x6 |0 O) R+ ]; ]( j
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    7 h" `# b" E, ]; |5 s6 K" T" d% Z1 _. q  R8 F, K
    # Train the model using the training sets and check score* U7 @8 e. W$ V# p) W
    model.fit(X, y)
    / N7 F& j: t2 f  p6 b, u$ O3 l, k$ T
    $ l6 V$ V% u: X3 \$ ?: W; e#Predict Output
    & [* S  r0 F- p5 L* l6 apredicted= model.predict(x_test)
    : n' K4 n- j. a8 e2 E# T. o7. K均值算法(K-Means)
      A& L, ?" W  H( u* O0 S这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。, L# b& `5 ^$ \7 S! B$ {+ i3 U
    7 I& C9 c, `/ e) R, Y% V
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    , e2 ]$ U, |9 O, K1 X6 y% A
    0 E. c3 M& r- a0 [: l3 V! Q/ I& @/ K9 r
    K均值算法如何划分集群:% T: a8 O& H; K2 A9 D5 Q* m. U  ~

    # \" X: v; u* Q2 Z: @  V& T- x, p! c3 Y7 o2 R4 i" X8 L
    ! b! D" ?! I4 F, `1 v6 z9 O% f6 `1 Y
    从每个集群中选取K个数据点作为质心(centroids)。
    3 Q7 c& `) @& r& `; ]0 `5 A9 R$ s  ~; |: f% j2 Y4 H4 D; h: ^
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    3 k( _' s4 q( Q% T: n0 x
    % k, E7 x2 u/ |% e% h' Y8 g找出新集群的质心,这样就有了新的质心。" z- ]: ~6 Y$ X- z& h
    : U8 _. P* ]6 s: X' Z' l+ Y
    重复2和3,直到结果收敛,即不再有新的质心出现。' o% U# z9 `4 u. h; U+ Y; F
    & ^( I- d- {) ?, V3 L

    - \" `. @' O. H( K! X* t7 L怎样确定K的值:) W5 |4 W( d" k4 P) s, U

    % v( O7 L1 \  \6 ^' Q0 J如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。# c9 P( K8 [) R: N# i  @/ v" A
    & u9 S5 S' g4 v' R2 h
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。! e3 M. {8 V4 f) Q1 H

    4 u3 e) h% D& K% b
    4 o( e2 n+ Y$ L3 Q+ m#Import Library1 H6 G/ f7 D4 E" I& E/ R- z1 X% N
    from sklearn.cluster import KMeans
    % ]) w8 ]- A; p$ h3 l' u9 f& m% Q& x# q8 R. d) h; x/ h7 \; i
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    8 X" P/ m# m; X4 G. ^. t9 j# Create KNeighbors classifier object model 8 r/ Q( k4 t" A, l; X
    k_means = KMeans(n_clusters=3, random_state=0)& B( A& @8 U- E3 m% P: ^5 [0 m6 Z2 n

    0 {4 l4 c- e, {* Y' o0 l5 l# Train the model using the training sets and check score
    * _( c7 Y9 x6 _% _" J$ |: ]2 ^/ wmodel.fit(X)
    + P/ H9 q# P- A9 y& D# Q% ]* K% S7 J! c: E" P6 M* ~/ @
    #Predict Output' V- Q" y/ P# ], a
    predicted= model.predict(x_test)  j0 n; S( E* F, b
    8.随机森林
    9 W' q5 O) l4 ?3 d7 z  Z  F6 c0 |随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。) q' X- N  E: c

    8 l; a! j7 X- P怎样生成决策树:
    + n6 P2 J$ r1 ]3 w! R0 }* z7 ?8 r2 Y4 f: x. E( j
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    , N: p( u* r* h& {  v4 @1 x$ n/ a  ~
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    * t4 ?: d- k+ ^& r1 {; Q3 u7 w" w( V4 D
    每个决策树都最大程度上进行分割,没有剪枝。
    : L: f5 s' x" J! p9 h
    2 p8 J' T2 r( f! O9 q7 d8 l#Import Library) {* ]/ r! g1 x5 T/ m5 G
    from sklearn.ensemble import RandomForestClassifier( x2 J  b  W  u& p
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset6 M$ @  k4 y" D* j9 K0 Z, S
    # C0 i/ A/ i9 _/ J' R  q
    # Create Random Forest object
    $ k( [8 e" P. X0 z( _! ^model= RandomForestClassifier()
    : E2 V7 {1 |9 _
    % K& a& E9 [: N+ y- S# Train the model using the training sets and check score7 Z! E/ [5 d0 F, G% Q3 X
    model.fit(X, y)
    9 `  i6 g( F  I* n7 w5 Z8 U* V" L2 i2 M6 p1 F& u" K: @0 K
    #Predict Output( r2 [% M5 A/ b* K6 H$ A
    predicted= model.predict(x_test)
    " o  J% V5 S7 p6 {: V9.降维算法(Dimensionality Reduction Algorithms); ~. Z7 b$ `7 D- @
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。6 N, e" i! b, t; T% t

    ' E' Z- h5 c& H% h; E/ \* m4 U- |例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。1 m) T) d# _- c% r2 a( r1 d
    + s( r* C" s9 _" v% t
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
      g/ F( t7 m4 s2 F9 U; y
    ! z2 P+ a' f! Y& C& h' u. c0 R' u" t5 x7 c4 Y8 h
    #Import Library' I5 f# ~' |& Q+ n. A6 M
    from sklearn import decomposition5 H, A: c+ Y1 K1 h+ T
    #Assumed you have training and test data set as train and test" E/ P# P0 v+ X
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)) J; V8 i+ |7 c9 {/ ~4 y7 e6 ~
    # For Factor analysis
    8 U- N- {! W6 P6 P/ h- Z  Z#fa= decomposition.FactorAnalysis()
    # @7 a, [- {, [8 K$ b# Reduced the dimension of training dataset using PCA
    8 K& d1 a( ~% i5 P# q7 `
    & ~/ i1 W$ ~+ G( btrain_reduced = pca.fit_transform(train)
    * E! K( S! t1 s- U6 S8 v/ l7 G- k1 M* N) w9 q1 J& \9 z
    #Reduced the dimension of test dataset
    5 p- U8 O) c4 w) G0 ltest_reduced = pca.transform(test)% a$ N. N  [; N1 s( b( F- ]+ h
    10.Gradient Boosing 和 AdaBoost% Y5 M/ N, Z% x9 q0 l1 H
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。9 z4 R4 K" U0 ~+ w

    0 X9 u% Q2 N# O8 U" D3 \8 D& k#Import Library1 W  a: ]5 W8 p) D% z4 T
    from sklearn.ensemble import GradientBoostingClassifier
    $ h+ Y% C! j) G! t$ F- _/ `, j* T#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset  G1 g6 n& s2 @) ]( T" z
    # Create Gradient Boosting Classifier object3 [9 A. }7 q' t2 v0 L' m! d
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    : _5 N* r3 i! \- {- b; y
    2 z7 j0 M+ U; B" Y: m, ]. O# Train the model using the training sets and check score
    , E/ @. C3 Z- m* a; ]  Dmodel.fit(X, y): B. L* k) N; Z: h" H5 x0 k
    #Predict Output  |# x  ]/ `+ T4 [% U' ^
    predicted= model.predict(x_test)
    ' x' ~! I2 g$ {5 f' }8 uGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。+ Q9 l, K& H" F2 _. \: ]
    3 Z- {- k* O1 T5 j, q8 D9 e. V
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    : G6 n; P' D5 z$ D. L/ z5 `————————————————; N# m7 a$ @, g$ U4 }, X
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  f8 \# x% y) F3 b) y
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075" ]0 s/ f! J' q6 q/ U/ _

    ( P$ A! Y) @% N& u# R
    ! P! C3 t: m5 h! v
    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-11-1 01:58 , Processed in 0.233094 second(s), 51 queries .

    回顶部