QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2220|回复: 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
    * H9 z( Z$ e9 \, E" D
    机器学习算法整理(内含代码)
    6 i; u0 _; g$ i; L/ O2 w7 q( k  M% S
    一般来说,机器学习有三种算法:
    ( P/ ^9 i7 n% l. `1 q# w) K/ S9 G/ c, }7 G: |4 m: ]* G& v
    1.监督式学习- F8 X! E5 C! ?4 J
    8 v4 J/ D8 @4 h" P
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    0 Q' U; Z- `' h; g  f5 X$ J* V) D! I) _9 c8 ~2 @
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    ! ~2 T. c; v+ d( R# u
    / n6 v# ?8 a7 o& J( k' M& a, H' A2.无监督式算法
    1 E- u$ |# C" `9 g7 A7 c' L& X9 [5 |* V7 `1 |# @- T
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.6 B2 P3 f9 L5 M
    ; p) y! m2 y0 Y2 q! J- A
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    ! ?. m  ^- v! x$ f( s1 L0 z5 y; [) Z; F6 i# n# S
    3.强化学习- L6 D" `: Z. g  X

    / h, }2 E% v' A4 }8 Q" I这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定& N  I) B  o# E! H- z. _7 ?2 s6 p1 T

    , E% Q4 P3 N  y4 n2 p+ k! g属于强化学习的算法有:马尔可夫决策过程
    , m* a& [. [( v# _8 l! d
    % k* l3 R& O6 v2 i% Y常见的机器学习算法有:
      B+ |3 r! k+ |) V6 M# R' f+ B$ G& m6 @3 F& Q9 o, {  O; o' Z' M
    # N* h) [: Z' @* f  X$ i  c# K; K0 k% I
    1.线性回归 (Linear Regression)
    6 f& r; ]2 y, Y8 R# n9 X6 L
    : y! @7 e0 B4 L3 Z$ t2.逻辑回归 (Logistic Regression)* F9 s% e6 Q1 X' Z

    % d6 w5 a* O; ]) v3.决策树 (Decision Tree)4 }7 O; v: H6 R" Q
    4 p# x6 P' E) A6 z4 w
    4.支持向量机(SVM)
    / g; Y5 U! u9 e  I9 g
    9 W: v: F% ]& W3 U4 k5.朴素贝叶斯 (Naive Bayes)- G. ?; S" e! u7 b$ u

    ( j0 F( B! N( m3 N2 u, U6 N- L6.K邻近算法(KNN)" T  z' @2 e% w' g+ Q
    8 n$ y' S: t! n' x* |
    7.K-均值算法(K-means)
    - O6 y; u/ k' z3 s$ U$ Y3 T0 H' I6 `# l9 p+ o
    8.随机森林 (Random Forest)& ]) R1 `7 Q7 b, ]- R0 q+ S2 s
    # O, `& Z: d- [  ^3 d' n
    9.降低维度算法(Dimensionality Reduction Algorithms)2 a2 @4 _6 D8 @, {: B
    5 \! n* ^/ C7 i. W
    10.Gradient Boost和Adaboost算法$ R- v) ]1 I9 R; [/ [, |
    一个一个来说:
    ) |; m+ S: t  b5 Y4 q& [& ^; P# G1.线性回归% g8 {& W7 x. f& L) W; R
    / Y$ H8 q/ b8 m: r
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.- M2 N# b- q, S6 x8 ~

    - n" S+ l4 P2 [0 K2 `3 h& S+ U3 B在这个Y=ax+b这个公式里:* o) ?4 W6 D$ ?! A' J  ?

    : w$ c% H. A) [0 {) \ Y=因变量: t  S8 O' c) R6 Q6 `, W! X) d( }
    0 B, H* c! a# F  z+ z5 i
    a =斜率: j8 Q9 X# s  _9 u* p! N
    , w3 g9 e" p6 R- [- \
    x=自变量
    8 Y6 L2 a7 Y: S. {' I! C
    / |4 R1 B- f4 E5 s" w+ S b=截距
    3 D' u  G6 m2 c5 l
    1 L4 {7 v2 M7 }& o5 D a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    5 Q. s, z/ H8 X/ z) W8 I: y1 T2 I6 o% \. U  X. A
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    " [2 w3 v! Z/ n3 _. G) `4 M: S0 x+ S9 Z9 p9 I5 W% U1 G7 F
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    ! K% G) q# O& d" S7 N7 C
    ) G% s9 G( X9 P% B9 H& U9 P  A. ~) a7 j& ?6 q0 w

      T, v" e0 H! O7 p: J线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.7 h4 k- A& i( G7 f

      F8 V' Z1 T, A( d+ a' _+ e) E, L拟合多元线性回归的时候,可以利用多项式回归或曲线回归; Z7 i2 Q2 @/ [( g5 [& d9 ^
    ( Y0 ~8 k  a/ n& s5 S
    Import Library& r) E  M$ m6 I9 v& N
    from sklearn import linear_model
    ' q- r0 n* l/ I3 x5 i
    - _0 j* _' b$ o# {7 ^' Ex_train=input_variables_values_training_datasets
    ' J5 M" Z$ m# O% K" \2 V/ n  ey_train=target_variables_values_training_datasets
    4 R4 {$ d; V! g: A" |/ A5 d% zx_test=input_variables_values_test_datasets. j* k; z: y# ]5 g8 s+ @8 a. Z' ]
    . \' @! L. w# {; A+ a% j
    # Create linear regression object2 ]$ t$ R: V( A4 e5 c
    linear = linear_model.LinearRegression()
    / O& T5 T' L: G  Z3 D+ t$ @$ @8 F6 t; V8 U
    # Train the model using the training sets and check score
    & ]0 }) _$ Z$ |: j; O+ Elinear.fit(x_train, y_train), L8 I% V/ C; A3 B1 |
    linear.score(x_train, y_train)
    1 m, L  L5 |5 W1 m8 ~6 U% N/ U  r) |7 x' X3 }+ m+ `
    #Equation coefficient and Intercept6 F" {% z# i  D
    print('Coefficient: \n', linear.coef_)
    7 X* X9 z+ D( n' k! U" P$ ~( Cprint('Intercept: \n', linear.intercept_); Z( F5 h3 P8 O2 p

    3 m8 r! P3 t. W& R4 \  F9 w3 K#Predict Output
    7 P0 n+ K$ F% ]! [/ Zpredicted= linear.predict(x_test)' P, m2 Y& l/ p& W  B3 T8 S
    2.逻辑回归
    ) R2 Q6 R: r: B5 b7 i; U( o  p( A+ N逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    ! v( @, S5 }4 L4 S4 Q7 q6 [, v8 M; h$ O: a( ]1 @5 U* Z2 l3 U
    同样用例子来理解:- F" j" n" d: F& [$ O% p" I; ]

    # m. T: v! w4 U# D! P6 Q6 f假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    , e; d, K( Y, h% g
    4 m. F$ w, L- }9 w" f5 }; E9 R  O/ E数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    6 G' R! u8 M! n1 D1 S7 |) A5 L0 b  r- s8 [+ _2 Y3 {, F. t0 V
    最终事件的预测变量的线性组合就是:( |7 g( v8 H6 h% h0 |
    & W* g. k& v( I% R& C

    ; N& D% h7 ~% }# ~% v5 kodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    " Y# y- {' M9 j# [9 z( ^" u& R% g! ]! u: X
    ln(odds) = ln(p/(1-p))& U6 A/ ^$ Z9 {) B; K

    - `& b# D2 ]7 Llogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk  M$ R3 J" u5 j
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.9 q3 }$ P* B: R9 O' r- I1 t
    ' {4 R3 e- k& O: W/ l& `
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.3 j$ m9 y$ e# P6 c6 u8 U

    - o, G# R+ c, k( T$ M( k! r: ?" ]0 Z# o8 p8 s; Z5 [) b- R
    ; ^: h' h/ ]  f
    from sklearn.linear_model import LogisticRegression. u0 H3 Z+ H' w0 j5 B+ s+ P# Z
    6 Y5 p  t- I9 K0 v
    model = LogisticRegression()
    % J) Y5 G0 r, |0 D3 e0 }- m$ X5 ^/ t2 I& V4 k8 m: |
    # Train the model using the training sets and check score
    & k% o  P/ g: m9 f7 i: b7 O0 E6 B  U model.fit(X, y)
    8 s4 q& H+ t" I; }; C model.score(X, y)
    ( N* b  a- [$ }
    1 g1 [2 e" Z' F& T% L) g% e; L" z #Equation coefficient and Intercept( w' s1 Y) @$ K7 p" Q0 Z9 f/ z
    print('Coefficient: \n', model.coef_)
    - i5 K' Z. d0 e$ R8 G- u+ i print('Intercept: \n', model.intercept_)1 J1 I* _$ Q! x  Q% _  ^% o3 [5 w

    % H: I  H* b( n3 w #Predict Output. K5 J8 r* U9 J& K' E  p; w
    predicted= model.predict(x_test)
    $ C, m/ R; m) r6 e( S9 b* o  H逻辑回归的优化:
    % g. b( V4 o( N# n% v加入交互项2 k! F3 V: ]7 Y3 j- D6 p' r" @
    8 Q9 u% }, U1 y  V* A
      减少特征变量
    4 c8 p* c  T" w7 j; a. S6 s% L" g& I4 ^
      正则化* k. a  H! d! \2 I3 v+ H# Q

    $ Q1 v! t/ m- {, L  使用非线性模型# i3 h4 K- g0 L( K7 @
    % J% n; m7 X- g6 \/ j, D) Y
    3.决策树% Z, B+ o( ?8 f
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
      B- \$ L; n5 B+ ?
    / o1 O) a$ E% j( U/ b$ H; p2 T$ ~8 f! Z" S2 B" K8 O

    2 w& v' z  f& u; R; g! C从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。* n, i) z( W" m( I

    3 v8 A7 |$ B: j$ w6 h# ^6 F- q& F) X9 a; l3 I
    from sklearn import tree
    7 s- Q2 U. j- k
    8 s* J- |& v6 U4 Y/ A% F. V  b3 k/ j  y
    # Create tree object 9 k3 E8 |$ U$ \3 W1 q
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  $ L6 L5 H+ w1 X" s8 e# D# R

      g& B) u/ R; S3 }) `# model = tree.DecisionTreeRegressor() for regression
    + B) Y( g8 O; a0 Y( V, W
    " s6 F9 S' z& [+ z" ]2 x, _# Train the model using the training sets and check score* q( {- T7 I7 o' H
    model.fit(X, y)
    9 V& y! l3 J  F, ?8 f; E$ [model.score(X, y)
    ( Z" }+ K5 g4 k- \
    + B7 Z! m+ C( |2 f: [#Predict Output
    ! Q1 u9 ]" g* t0 epredicted= model.predict(x_test)
    + v  o* j4 E4 |, J3 z4. 支持向量机(SVM)
    + }2 K1 p+ ~& w& ^! c这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    0 Y/ u$ R' ]* n2 F2 o, V) c
    6 n: U' S! }3 p9 Y4 A3 J. V现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。8 H0 z' B1 Q1 _/ r

    1 b: Y7 u1 W+ d! N
    8 V) o! Y6 V7 w: B5 F" ^! E( i& E  b) {" q& z- Z( e( Y
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    # o+ M5 P6 u( E1 L& V
    ( L0 o9 q# i7 Q2 N#Import Library
    % h* U1 @% R4 Ffrom sklearn import svm" x! w( v, z9 C/ R4 Q: g4 B
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# t. K2 o/ O6 I/ r/ H5 x
    # Create SVM classification object
    ( [9 j4 L" `, I( ^8 i
    % e: p: J3 }& h+ l4 {model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.' f6 t4 s- y& q9 `' Q% X1 T

    3 g- m" Y6 M: S; D4 w" J# Train the model using the training sets and check score
    & b. `( L6 J* R; T  s$ s0 Pmodel.fit(X, y)* I+ R+ i: |+ m6 m7 `5 g
    model.score(X, y)) M0 K+ a' c& y* @" ~

    , _; ]6 ~8 m% d7 v' Q* M2 u# r#Predict Output+ l4 Y) i1 L1 ^7 K: p2 w" D8 }
    predicted= model.predict(x_test)
    9 ]: N  A( |, p0 G' e, {2 K  ~5. 朴素贝叶斯
    1 d; B: b- W* n: I这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。. u% }/ S, C* H5 Q6 A

    , X' b" d) a2 f1 |. f2 J6 d朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    ' I& v  B! c: ^- f
    " D' [: c* m7 Y贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    / X, F& p$ ~  x8 s
    + _8 d, D7 e9 x. ]6 c- _& y* o  C% r; Y$ F
    P(c|x)是已知特征x而分类为c的后验概率。
    / {* ~2 h& ?8 p5 Q& G; `( X1 p5 g1 C; D# A) S4 W9 [
    P(c)是种类c的先验概率。' m# J4 q# B+ m

    $ B5 m* W1 ]& O0 N0 ZP(x|c)是种类c具有特征x的可能性。
    ! D9 v7 J+ R& x  V2 A$ ^4 f8 S+ T
    ' c* c/ @/ G/ z* `. F# o9 n# oP(x)是特征x的先验概率。+ j8 M  C" ~3 e/ S
    ; _- z: V" N# E  w

    # ^3 m# s& q6 D: i例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    - c3 |! S$ q/ n9 {1 t- V* ^( V& o7 J# T3 K: T6 Z8 y
    步骤1:根据已知数据做频率表
      h4 g) \2 ]1 o$ q( n; E# D
    ) D3 s1 |/ E; s+ J7 T% f步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    6 l' n7 r+ C; L% F
    0 N3 Y% K7 H6 \9 o$ F+ g/ H9 l8 x$ j) I; b) g
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。7 h( F, E" n0 X0 Y. \7 l
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?1 y& R$ y' A3 @  g

    % u3 I1 f: a* |$ k. Y/ w0 k* C我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。8 s; r7 T3 H/ V$ w9 [- s  y% o' w
    8 W  q0 B; ^; |8 T  d1 A
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    . M2 n8 J  Z% G4 A) F2 M4 K
    4 c8 [) l: n# \那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    0 Y" J6 E" ~+ |3 d
    . g5 ?- v/ b) @5 d; \5 M- ]当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    4 K6 K/ s, }" y0 V$ ?4 ^4 [$ `8 \8 [* ^/ @' f7 ?! J
    #Import Library
    8 o% `) y" k; Q. U/ i4 tfrom sklearn.naive_bayes import GaussianNB  {1 h$ {. f% E+ Y
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    , a, F, e1 u% u. U$ T& Q7 |7 t! q4 y
    & _6 r7 _# _, ?; R! {. R# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link( L9 z  d; y& B
    - c$ @# m  Q7 @; L8 h: g
    # Train the model using the training sets and check score
    , v% c1 g* G, g2 G+ o2 X" j( zmodel.fit(X, y)* K$ Q, ^5 j8 Z/ S
    : J3 N0 Z, r" J9 c( F# y( o* O
    #Predict Output, j( b5 X& h. w9 e/ l
    predicted= model.predict(x_test)
    ' ^; G; @# G! L1 P* }% _+ D6.KNN(K-邻近算法)0 |' {: q; F, M' m7 I7 m. Q
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。, a6 {  T. G" b' E- s0 \, I

    ) h+ F$ U. k0 Q- T; U距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。- M' q+ b/ ?1 e2 S1 k& E/ J
    . W" ~5 x2 H% s! a$ Q- w4 K3 @
    " ~! E; }# S5 H# F

    ' \9 J9 s$ [" }+ i( `. a" |# dKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。' m: K7 }9 n. M7 s( |
    - c/ H6 w! p5 v5 g
    在用KNN前你需要考虑到:7 _' O' q& K/ X; }$ c& A8 Y% j
    . M2 i+ ~$ {; G- R0 Q- r- H' `9 [2 S
    KNN的计算成本很高
    ! D% B. _5 s! n+ L) g# j/ D. I& L$ \) z- C7 m
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    1 [) q: Z1 X2 Y# B3 n1 S$ y# X9 a# r  A# I. {
    在进行KNN前预处理数据,例如去除异常值,噪音等。9 t7 o6 J9 m+ y7 [8 w

    5 u3 Y1 B4 K, z+ ^/ b: M#Import Library
    ( e$ _4 Y5 y* f+ Zfrom sklearn.neighbors import KNeighborsClassifier
    ) p, f( C( E" G' d/ b  y& m. a4 b
    + T; M' ?: y" @* L#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ( R) O8 Q: q3 a6 V+ O# Create KNeighbors classifier object model " B& ^* s7 y: Q, f9 C% A

    + B5 j; u+ E4 H' jKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    ) |7 p) u+ C+ `' w/ O7 x3 _! C. I1 u6 h/ s8 Y
    # Train the model using the training sets and check score
    + y7 M! N, `1 Wmodel.fit(X, y)3 J# Y' K) K8 n: g

    9 N0 d6 h2 ~+ f' r5 b. e#Predict Output0 s  l3 u. R  {6 o, J1 p
    predicted= model.predict(x_test)
    + a: K) d' m3 Q: |8 M7. K均值算法(K-Means)
    . r' ]0 W  v& w这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。6 u! M. D" n: E" D+ |2 j
    7 G, K9 o/ j& Q0 s# x- E" E
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!5 h" D& X1 Z$ l# S( [1 v

    3 f: t' `$ j9 Y
    9 A1 O/ n1 {0 n. v* m2 A, eK均值算法如何划分集群:; W, q5 u1 S; \$ N- H& X
    4 [, {6 I8 Z* T: b3 h7 J

    & J* s4 s8 k, c4 i# `; @- h! q
    1 M' |! h5 ~3 g) f从每个集群中选取K个数据点作为质心(centroids)。
    ) T! Z2 e/ N: w) M; T; ^) t6 z2 }" z2 H% w3 U
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
      ^( t* M3 @& `- u% p3 ~! Z" _4 s
    找出新集群的质心,这样就有了新的质心。
    - `0 v* b$ D! B" x# o8 W
    : ]$ x, T" g) C: j; e6 T重复2和3,直到结果收敛,即不再有新的质心出现。
    2 Z0 Z& V. ~  b7 i/ C: K
    3 V: ?/ [& l- n; [3 d9 L
    ) i. E) \8 I) m  M! D4 I& W怎样确定K的值:
    : P+ }" C8 b: J- J- S, q  L% V  z0 N% D* o, ?1 a
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。- k) ]6 U& \4 _! Y1 I% w
    : F: B  W! ]: `
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    6 z- T, B# `7 Z+ x% Q# Z0 f+ Q! q8 ?& B: P* {7 ~, V

    * [6 L  i1 M7 n* \0 P2 `#Import Library
    . k, f* S8 W4 Ifrom sklearn.cluster import KMeans4 U* V) h2 P* D) N, h* t

    # D1 S, H3 T, _+ O' r) P#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset! }5 n' w% A  h6 X, ?! ~" ^
    # Create KNeighbors classifier object model
    : Z$ H' d2 o2 r& N- ok_means = KMeans(n_clusters=3, random_state=0)
    0 Z2 c9 h  q% w3 J. [" s' N, d8 N( `% N6 X
    # Train the model using the training sets and check score
    $ U& O3 C- d8 mmodel.fit(X)
    : C: p) F+ Z* d0 h, x3 G( r6 }2 T! Y5 I9 ?
    #Predict Output+ i7 A8 \/ v9 o
    predicted= model.predict(x_test). ?& {& ~. E- E3 l" m4 _
    8.随机森林7 u1 a0 C: w% s
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。  q* ^6 q9 o9 V# b7 R

    5 n0 W$ y: q' b怎样生成决策树:
    4 q; ?% F  K) J% y0 s3 A8 T- q
    7 f7 ?4 b$ n8 O, e7 v( x* B如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    , i) y% j' X  ^4 r6 K2 P& e3 |! d$ p! s$ P! g6 ~, |" r2 L+ ?5 K
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    . H! }1 r2 y& a; d3 P. |8 e: Q& V& S$ Z  a9 i( i  x! S8 E: ]. Z
    每个决策树都最大程度上进行分割,没有剪枝。3 w! L( h0 [" \, a1 m; c5 N

    1 f( A) U1 Z5 Q/ E% K#Import Library
    ; F2 |+ [% p& E! Gfrom sklearn.ensemble import RandomForestClassifier
    , e- e, d) X5 H#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset4 l, Z" m7 R& `( k. Q' N
    3 P% Y2 N7 M( ~4 w  n
    # Create Random Forest object
    9 i4 ~% P1 ~& n4 V) h+ Hmodel= RandomForestClassifier()
    9 n: K2 D# h8 l" o' T' p6 W& S0 n. S% Q! Q3 E
    # Train the model using the training sets and check score
    : h$ M9 @4 s. b7 jmodel.fit(X, y)$ |8 \( k1 Z' l1 U
    " _- w+ R1 O, r% \1 M
    #Predict Output% L9 c( h. D- Q3 l
    predicted= model.predict(x_test)
    ! @! Q4 g, P, k; u8 C9.降维算法(Dimensionality Reduction Algorithms)+ G" l4 A4 C- q- B3 \* J" [. e3 k
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。7 [* ]# b" y; _6 r. s2 O5 C) k+ y
    7 e. y- e1 p7 E& F( \: @: p1 R
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。- R7 e4 C1 D% ~' T/ Q" Y2 Y
    " B& r- F' }: x4 M
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    " Y' Q) o1 y( F7 b8 _1 b4 x
    ! w. f) W  A$ P% k' M" Q
    9 V* W" }2 E, N3 f$ c#Import Library
    $ N- }4 n* U" efrom sklearn import decomposition2 M' a/ {+ m! ^/ ]' x
    #Assumed you have training and test data set as train and test( @  a& `% J" L0 ^  Z; t
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    ; d" X: c' b9 [% G6 W+ T# For Factor analysis% v7 H' l8 j  w! T9 L
    #fa= decomposition.FactorAnalysis()* _5 ^5 r7 R' k' G( H
    # Reduced the dimension of training dataset using PCA2 S* f+ O2 O! i0 w+ G
    6 Q4 O+ T4 ?0 D; X) {9 J2 ?0 g
    train_reduced = pca.fit_transform(train)
    - v6 t6 p) {- j/ }! X
    ' C% ~5 F2 L2 F" o#Reduced the dimension of test dataset& r! J% x0 ~  |& e; A: I
    test_reduced = pca.transform(test)
    6 Y" U7 @' v9 e7 X' y10.Gradient Boosing 和 AdaBoost. d5 j, d8 U9 Q5 R) Q
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    ( Z) }% [8 d0 ?% @. u$ Y5 Z
    * T# x$ e1 Q+ T- i- ?8 d/ q#Import Library
    4 |7 f- q8 ?- J5 Xfrom sklearn.ensemble import GradientBoostingClassifier# @# |+ H! b9 ?1 j$ g6 y4 \
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ( v; _/ t# @+ e: b, ]. i1 Q# Create Gradient Boosting Classifier object* S$ Y& I& x6 Z- m4 ~) `* A, e- I
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)5 p7 k4 a0 O. ]  M

    . `4 B/ E% H! E0 T7 N# [# Train the model using the training sets and check score
    * E8 c5 z1 x  Gmodel.fit(X, y): x2 q& M8 g  @8 V
    #Predict Output
    - ~1 I" }  ]' `5 K( p, {' Opredicted= model.predict(x_test)
    1 A! I2 T* [" K6 v( F) u! V7 vGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    8 x1 i  i3 X* B* g/ V6 e" _( K' s( ?; |3 p2 l9 y" `
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386+ `. ^2 N+ P$ B% d
    ————————————————
    ( G+ A$ R3 `5 T: e' H* M) l版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    7 J4 a, X+ G( B1 Q! k原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    ! L7 a# l% F7 q" _3 [$ w. j9 L; h( O  ~' w% z& y- n6 S

    ( K3 i7 Y+ ~; K5 _: G: ]
    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-6-16 04:42 , Processed in 0.320635 second(s), 51 queries .

    回顶部