QQ登录

只需要一步,快速开始

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

    ' r( E1 }- E' Z1 _, `机器学习算法整理(内含代码)
    0 @2 B9 K$ N3 K1 y5 ]7 y. y! U/ }* k
    一般来说,机器学习有三种算法:- V+ q# l3 K3 E7 }+ A4 Y# e, ?
    # P* a; E; I8 E' n- u1 j
    1.监督式学习1 Y5 Q. C0 j, u0 M4 w
    + `# u5 `; L; t* U
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率# S1 ?4 T, v% \" N& t! c
    7 n7 W% l4 |+ N4 i
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    6 f; d4 S8 b& J
    & \( e: n0 q5 x4 N/ k5 G' M9 p2.无监督式算法4 P7 Q2 O9 y1 i0 T: }$ d0 Z

    5 Z, u9 A6 `, }) e9 K0 _  o6 b1 O无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.1 F) p0 n' d1 P# E1 K3 `, B6 r" C

    7 k0 [; w% q4 U& ]属于无监督式学习的算法有:关联规则,K-means聚类算法等
    " C6 t& r( V1 i7 x; }6 |: y
    8 d! u2 B- o, `0 ~4 r3.强化学习+ A: G& q# e3 v

    , u( n" @$ i; ~% A' r5 f+ ~  c  U这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    # R$ G4 O4 _% b; q, \, e& m3 G& d9 r# P* {3 ^- p5 d9 E# e& \
    属于强化学习的算法有:马尔可夫决策过程5 w+ O0 o" s, @( t% b8 {

    " q  |( O8 T6 ~2 E$ a2 K! n# Z# T常见的机器学习算法有:
    4 ~5 R& q; D! z+ R% E/ ^$ V6 h. ~& c( C9 `! V! i' z
    ( F- Y: S( H9 t0 f) l
    1.线性回归 (Linear Regression)) h; l8 O  L' l3 Y

    ) q; a. `5 f) Z2.逻辑回归 (Logistic Regression)* O+ x8 Y" N. A1 R. C4 v1 ?+ M; h! B

    ( \! X3 {$ p- U+ Q9 ?5 f3.决策树 (Decision Tree)
    - H; D1 r, B/ b0 O& l7 `/ U( S* E
    ! B1 x  U/ K7 [/ G! \4.支持向量机(SVM)1 [7 j. y" t, r; v" q# w
    # E% M7 D5 \( R, L
    5.朴素贝叶斯 (Naive Bayes)
    9 ]2 ]0 V- \& {7 T1 x6 g0 w
    & I7 {, Z" ?! ^& e6 x: }0 g6.K邻近算法(KNN)0 e; e( y! M/ K3 k) D$ G6 T  {

    & s+ [9 C0 h: M  F5 v9 F$ u7.K-均值算法(K-means)
    6 e0 A1 H+ q  J0 w5 W
    : B7 A( L7 o$ j! O, B. [3 z8.随机森林 (Random Forest)
    " s! t9 w8 o& T8 \$ z5 I6 C  g7 K  J8 D; x0 k- p8 v  [3 C
    9.降低维度算法(Dimensionality Reduction Algorithms)
    : k" l3 J6 P) [) E/ u
    + ?$ S! m( b8 M8 N2 |2 ]; c9 U: m10.Gradient Boost和Adaboost算法
    2 R) j5 p* r- R2 r一个一个来说:- \1 ^% m5 j! b1 f$ G0 @$ t
    1.线性回归
    1 b- e" u$ ^7 u2 R$ R# H& q6 N
    1 j2 e, I  m9 J; E: T2 e* @线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    - y! X3 `0 w! x- t+ Z
    6 e* _% J$ |/ I在这个Y=ax+b这个公式里:& k- Q" P  {/ a" u7 B

    * P( I% o+ x/ j1 x9 \ Y=因变量' M. N* t% X+ l/ i' k9 `' O

    6 l/ [+ p4 u8 B0 k1 x a =斜率
    + C4 T% ^. M, `+ W+ Z) M8 l
    , S# y: I. p  ]" }# @) e/ G x=自变量
    , Z" l0 r" n1 t  @# u/ `! u! l: L  B( a) ~' L6 R6 ]* O4 g
    b=截距
    1 L; ~8 l6 }* Y8 r, F( L$ P$ I1 r1 O+ J9 T0 j
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    7 o" U$ |& \# z3 {
    3 {7 v- ?1 x3 k" A$ I8 V我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    ; |4 e1 K- ?& p- r  T$ e; L* J' u* x8 w4 A: S
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    ; V+ f5 P; w/ R. g# o; N" M9 P9 o
    9 ?! M7 d; [1 E- Y% h2 e4 u: O) s; C, m0 R- I

    # H/ G1 [+ R5 p: n1 z' e: q线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    " g$ O* Y1 u* E( S1 x3 W  Z- X. C" I/ Y. k( ]9 T
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    . O/ z# L" Y. s
    0 l2 k' B) R7 w, ]Import Library
    4 Y3 W" r% ^4 ?; P  Y4 U: C( hfrom sklearn import linear_model
    4 H) m- \6 W0 x9 w1 m" H; V% b( u% T
    x_train=input_variables_values_training_datasets, w$ D9 x! O, q0 z  \0 |8 T
    y_train=target_variables_values_training_datasets
    0 b3 Z) v) e) y( z* l0 y' Fx_test=input_variables_values_test_datasets
    4 B. ]% P; J( G2 d- d) {( O/ z4 H& w$ w) d' q8 M- B. c0 w2 K
    # Create linear regression object6 e3 c3 C7 J# T4 N& }
    linear = linear_model.LinearRegression()
    5 @1 x" b5 Q/ P
    5 z4 Q/ u7 u; G1 A1 P/ |% J# Train the model using the training sets and check score
    - ?1 K8 J/ b; t1 I% v. Ylinear.fit(x_train, y_train)8 S* T! d) D; U, J; _
    linear.score(x_train, y_train)% u( [& n7 b  @* o! \
    * }7 w) U' Q8 j
    #Equation coefficient and Intercept( S3 J* G; s, f4 T
    print('Coefficient: \n', linear.coef_)- G5 P) x- \, o- q& {: c
    print('Intercept: \n', linear.intercept_)
    4 c  e/ K7 |9 I5 M" a5 x
    8 A: [+ H9 Q) V7 z: B, V#Predict Output
    : |3 `7 J! C- D. Q3 a7 y: N0 Hpredicted= linear.predict(x_test)
    / K5 Z! b9 w% f& n8 e. \* P' Q2.逻辑回归
    & R' K5 |4 R1 C9 M& ]; ^逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!: T5 l9 c9 k6 A! \
    + o3 W, G' K6 D  d0 D
    同样用例子来理解:) Q" d+ O5 O; m7 l3 n/ v( N

    7 W7 g  l0 H$ A' Y% ^% C. c假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    7 |& Q# A9 p9 }# v1 c
    ' S- I4 N# l0 l. B数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧& O) d" B2 Y9 X
    . j8 c6 `1 _( m) x/ U; J
    最终事件的预测变量的线性组合就是:9 f1 }7 `: p) B1 E8 r* R  S% F( s/ |1 h

    $ p3 L3 _; f+ `) O2 V* g. l
    ' m( Q) E, e' G& I3 j* _! yodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence8 j* K0 z* M/ o4 P) ]9 ]% M( a

    " b# a( w- R; ]7 f$ E, G$ C* g7 fln(odds) = ln(p/(1-p))
    " ]* x4 o& Y' i- T' U! o  u# K. s; }! z5 `9 S& l
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk$ q5 j; k) J4 x9 N8 @6 {9 v1 |
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
      N! O) R! N9 [/ w& K/ B- s
    7 z9 d- X; F* K9 g6 ], f至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.8 Y/ w# z. M+ w/ P! e

    4 \1 I' h0 S) M8 K9 f6 g# Y: Q7 k( Y' X4 ]8 X: O5 c0 ~

    : ~/ K( F; v* m. G- S from sklearn.linear_model import LogisticRegression
    & h4 y8 C' T  x0 R/ R  C; i  b) a: S0 x" h6 \1 k! \
    model = LogisticRegression()
    1 D4 h( v# K- K. u  d3 o
    3 K1 [/ ^. o& Y" Y # Train the model using the training sets and check score
    8 U  f4 h. w% k6 l# a model.fit(X, y)
    . l; ]+ E( v' U" y  r7 Q model.score(X, y)
    8 y7 ~, m/ Q1 a8 C1 N  `3 D' A
    ; U6 g, {  i& G* M* P+ Z9 [5 a& U #Equation coefficient and Intercept8 Z2 b1 V4 |7 e; S' r4 ]
    print('Coefficient: \n', model.coef_)
    / z9 K- z. T# L. H! K' ?# U3 V print('Intercept: \n', model.intercept_), Z: q4 k- d$ [+ B# X& D9 w

    ( \  U8 ^+ L  D$ H& r #Predict Output
    . C: {- k+ `0 o5 ?. ~ predicted= model.predict(x_test)
    % v. i" q: I7 ?0 L! r" R逻辑回归的优化:0 e9 R* @3 {, _4 D) h0 k
    加入交互项- o& |9 @# {  _

    " B# g, L& H, \& r, Y4 n  减少特征变量
      m7 E5 r( Y, @9 v8 A
    # D, [7 g9 K8 X% a/ S& I5 h  正则化- H0 M' N$ G9 F( h
    8 H  \0 A( z5 ^' q0 Y
      使用非线性模型# q( f0 O3 T. f* a

    5 L8 O- i3 W( C! ?$ m" R8 j3.决策树$ \1 w3 ~9 R! {) `
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    1 \, M7 a+ P8 f6 D* \$ ~2 g
    * p1 E9 ^4 n, w$ J( `3 S& _# C* R( G

    8 ?0 X: W) L. K( v从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    ; i9 y2 W- [  b% u. [- m1 y
    & t  [/ M+ S% r( u$ g6 w/ J# V" x7 v. P6 m$ `2 i
    from sklearn import tree
    1 V* i9 R  K4 _4 m* `9 j+ A" L. [0 H6 O/ u- Q% V! W  ^1 _

    + [% H* Z9 G# L. N! X. s# Create tree object $ ^* Z: x1 }6 C# r. p! `
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  / G) Q! y; e9 O5 z

    8 c: ?3 _6 Y# ?0 I5 _# model = tree.DecisionTreeRegressor() for regression
    0 p; r+ W  z/ g1 ^# ?9 o# e- `8 L+ S/ g! L) N2 F
    # Train the model using the training sets and check score
    , Z* Q/ y& F, Y$ Nmodel.fit(X, y)
    6 G: b/ t4 ~3 e. mmodel.score(X, y)3 K. x3 k' _0 ~" z+ f2 L* J

    * d, y# S. a2 d- M#Predict Output
    5 O5 t% }# M% e" bpredicted= model.predict(x_test)6 c1 m1 Y: I* b7 {( g) P
    4. 支持向量机(SVM)
      H) y8 k- ~5 q; H; A这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    . S' r% j8 \! E. `& ]
    - F' I' P, C# f0 T" |1 `现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。) {  c+ t# @  _: @

    % j7 r- B$ n! ~1 F; y2 ^( Q  u" M
    0 O8 c. Y, x" h
    $ O' ?! C; l7 |& I! z' v1 H在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。. y- G, w7 W" f1 S& Y3 X8 {/ N$ d

    - }" A6 ]: X# R( W#Import Library! y* F1 E$ H4 W2 l
    from sklearn import svm
    " T4 ^( O# S3 L0 p+ C6 ?& p) q#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 p/ ]. {8 {5 z0 m
    # Create SVM classification object
    3 b, P6 r* B* \8 Q9 `: {+ Q7 t: k/ L8 W% {) ?; S! `" @
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.* J$ ^: W9 t, L5 y7 J+ y6 K* H, K3 Z
    ; e. r* K5 q% n  e1 n: q- P! C& @
    # Train the model using the training sets and check score
    ; N; W. T3 L5 L" [model.fit(X, y), p, U6 \; u9 ^. q3 ^  Q
    model.score(X, y)9 r& }& ]/ h$ j" g2 w) `
    5 u8 K! G9 D" }- k# N8 W/ r' L
    #Predict Output
    3 M. g* g" e& apredicted= model.predict(x_test)
    . l  `) v! T& ~/ q5. 朴素贝叶斯* q$ \7 i) W& x* h" d6 j+ {) t
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。( J/ a6 J' i* x8 D$ Y9 D
    : ]. ]) o$ C' u3 M' M3 H3 Y( Q
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。* W7 J' c* B+ p8 z
    7 B& Y$ F  O+ Z2 [. \
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    5 E2 F$ Q& q& R! ]9 k% k
    3 ^, d$ f1 A+ B$ y2 s& ?4 m4 a( v' Q  H7 m( P
    P(c|x)是已知特征x而分类为c的后验概率。
    ' x6 g. K" [' r: N& h9 k$ p
    3 g8 {" @; A3 @/ WP(c)是种类c的先验概率。+ V" l1 \  p  Y8 E9 p

    2 s. R2 J  X& c# PP(x|c)是种类c具有特征x的可能性。% ?% d7 Z, _6 z( G6 T+ I6 x
    . F9 U2 n, H* j- Y
    P(x)是特征x的先验概率。
    0 d* m. q3 [3 x/ s+ K8 t! ^# S% J  \
      R2 X4 y5 ~8 Y( Z
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    * `" t, o, d! i' f
    ; B4 j2 H/ g7 r6 A( L* K步骤1:根据已知数据做频率表
    , I# x! a% I" ]) l# \* ~
    + X8 B4 p# W, Q7 S* \步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    $ f& k0 o4 ~' C# V8 P7 f+ c  V( O/ p5 h- D

    & R& W, g9 T" n: h步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    7 n* Y' f( ^# C8 L& K2 Q) B( {提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?: C7 @$ q' K1 _+ C
    0 s2 m/ _4 e/ v, a3 y" ]5 n
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    9 j& i# s3 O: D2 U& N1 t
    9 D7 _# y5 \  ?7 ~! F2 r( A; y这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    1 \0 {7 n. T$ i4 w& E2 y5 Q
    ( ~( n- t$ P2 M' C5 ]( W/ e那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。$ l0 E" e, g1 P7 I: l. l3 }
    9 a, J$ d, u8 B; N% `2 v$ e
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    " s* U" |! t5 I3 L# \$ ^/ W# o2 o3 H9 {
    #Import Library4 l8 K6 q  v0 `' {5 ?, A
    from sklearn.naive_bayes import GaussianNB& u0 l2 Y) y  `
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ' G% w$ p, b5 U0 ]/ S; X" ^9 t! I, Y9 g
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    ! c4 f) l) ^0 ?; w+ V4 g( h) P" A9 G. d* M1 n+ A9 H, Y+ r" q
    # Train the model using the training sets and check score
    1 u; p, j: i: P+ j% w2 mmodel.fit(X, y)0 T$ A' |5 s% H, {5 I5 [% x* i

    4 H; ?  u. g7 ~0 M+ V) q#Predict Output- q) N: y) A$ X2 h% p( F, E; i6 q
    predicted= model.predict(x_test)
    8 M: W( k7 E  m3 Q% Q7 }. c1 O, O6.KNN(K-邻近算法)/ y# M" Q0 H8 o( R' Z
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。* E. s! Y( D( [; I4 w

    1 D2 i! O0 i& ?0 _1 ?$ c- r距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    . @5 p4 ?+ W8 t6 n2 U
    ! z5 e) v. N8 Y* T( i0 `( w, D/ g1 ]1 x2 B4 ?4 u+ J

    4 w* r/ J+ M; ~6 k1 YKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。, Y  z: l' a" S7 B/ }
    ! |  }7 p; c: E" }, o  t1 l
    在用KNN前你需要考虑到:% }$ [. z6 e+ m! H
    + C( |4 a7 I7 T( ~7 N# c
    KNN的计算成本很高5 @7 Y% |, {" a+ W- h# R

    $ U* F, L3 \# |& P1 T4 E所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    # M' `1 w1 ~/ {) n3 j# {% W" Z+ T6 [
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    1 N& t; t: J9 p1 C- E) T2 N  q4 U4 g
    #Import Library
    % X( ]/ f$ I% y6 M2 @+ L+ U, Efrom sklearn.neighbors import KNeighborsClassifier
    0 `5 c- R- x% @3 Y4 c7 `- b, k1 D
    6 K7 {% u! I8 ?) H$ |: B#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ' h# _) g5 Z0 |2 c: W8 c, \# Create KNeighbors classifier object model " f4 @( a! l# S  ^

    $ u; \1 n# x1 P9 RKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 58 C' a+ D% ~, t) g5 M, D3 ?9 o1 }4 l. ?

    ; [: t9 e1 D: W3 }$ u# Train the model using the training sets and check score
    ; @; t2 ^3 U; O( N+ n/ I% i3 mmodel.fit(X, y); n. Z) u1 n( K; j7 P1 K' R+ S; A
    ( n7 T9 T" j9 F
    #Predict Output$ n8 f5 e. @2 o1 v; K6 W3 I
    predicted= model.predict(x_test)
    ! A+ C. ^0 u# [( K* m7. K均值算法(K-Means)
    # a7 g% D1 C/ P这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。6 |, `: `) t% D9 g, b% a9 l
    2 @1 m3 A8 n+ v+ F7 s
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    6 w" _% U- T' r* T% A/ j0 P: {9 y: s
    4 y, B" T) V5 Y& ]0 \+ n
    K均值算法如何划分集群:- {) }$ v) }& o# u0 S

    7 L0 W1 ]$ J. G5 P& s4 X
    * p# o  P* [! m# k" l1 h2 A' N, ~, U9 A- z7 l5 f/ B
    从每个集群中选取K个数据点作为质心(centroids)。
    ! ~/ \8 M5 J: u# g, O* p% n' h' Q3 e
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。+ `; f7 u$ U1 F0 J
    ) z4 u; d7 c9 ~) Q
    找出新集群的质心,这样就有了新的质心。
    ! e# d6 b9 x8 ?6 ~" Z+ U8 N, O1 x
    ' h5 h3 e: N) y# k5 a5 }重复2和3,直到结果收敛,即不再有新的质心出现。. _# ?1 e9 y- F9 M8 V

    ' ]. S+ R6 b! J( m5 f5 A* f1 g$ u
    & Z& y) B% n# ^  ~怎样确定K的值:
    4 U7 h: d5 M# L. I
    , @+ G" p7 ]5 R5 F) ?, L如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。; z8 o6 I# s; I

    5 b8 c* {' Z# M我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    . D3 P6 i5 `& U9 T6 }& x
    1 h" f+ o! R0 w3 s# }7 `) W) O9 k/ f1 N( W  E
    #Import Library9 B& g3 }8 s6 Y! M( c- h9 {
    from sklearn.cluster import KMeans8 V/ M( h1 b% t4 s- {
    / w' e6 Z0 l9 |. \# R
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    % _2 [6 c% ?4 S/ ?# Create KNeighbors classifier object model 8 J6 b& A' W8 _8 }
    k_means = KMeans(n_clusters=3, random_state=0)% x+ u1 `) {+ F9 `3 x5 X  j
      R9 \; F0 r7 i+ T4 q
    # Train the model using the training sets and check score! n6 z7 W7 J3 ~8 G) |$ W
    model.fit(X)8 j  K* A" p% a3 u
    / `% c  n# Z5 z7 l" s: {
    #Predict Output
    , W4 V' r! k) i9 @+ ^predicted= model.predict(x_test)% t6 W% P2 ^) ?8 j5 e
    8.随机森林) D9 j! N) N* n0 n- e
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。! Z" t5 k* J  z1 {( q+ c/ v, i
    & L9 L9 x$ u% H5 m5 q0 h) t
    怎样生成决策树:6 O2 H: _3 h+ t" Z, P9 Y3 o/ d% F
    / {) M( a+ i" X: t( [( H
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。, w- r9 h# J% O9 w

    , M' ^9 b) n, z! }如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。, Y' {. L1 D* u5 H# M

    & g8 {! j/ O: u! `! @& `每个决策树都最大程度上进行分割,没有剪枝。& E6 w) H( _' O) @# S
    4 g9 Q  I6 f; S* t. V
    #Import Library
    , @# I1 L3 b9 i9 J# Y- e6 Dfrom sklearn.ensemble import RandomForestClassifier+ q1 k# N0 q6 C
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset, y5 B& L% ^4 O$ {' A
    ) V0 K5 y7 f0 A) V6 d
    # Create Random Forest object% K0 F. t* @% C0 |# W
    model= RandomForestClassifier()
    8 _" {- k. P. |2 C2 L3 u  M1 p' A6 ^4 f! A* B
    # Train the model using the training sets and check score
    , o4 E9 V. B5 T( o) z; N2 Smodel.fit(X, y)
    6 H( Y  o/ M0 k5 O  }, E9 s. E  A8 B$ }: e
    #Predict Output
    * O2 Y& |# z) w) ?2 U7 Dpredicted= model.predict(x_test)" @4 L& T1 u9 u. A7 u( \( [; {3 Y
    9.降维算法(Dimensionality Reduction Algorithms); _5 W$ m& c2 h' s" V" v
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    " Z! K( g3 _& o0 i! \& h
    1 A# q& B# \' i  w. K. L例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。' W1 X" N& ^2 `' D: q1 H* F) `
    3 A% B8 W% }+ Z9 y
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    - Y  r% j$ f# D2 t: I. U
    ' b. Q) U; |" M0 n+ {" y5 Y  w9 t# S- W' {! X- n+ T% [/ _4 @/ R
    #Import Library* `# @# ^2 o/ r. n6 s" ?/ u1 B
    from sklearn import decomposition! ]$ e" N% z2 u9 \3 v; A% U, y2 V
    #Assumed you have training and test data set as train and test
      P1 i" }# k: ~7 J  c1 e/ c# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    ; [9 w2 T& ^0 n; `# \# For Factor analysis
      X0 Q- o) N' H5 }+ W' w; j8 q#fa= decomposition.FactorAnalysis()
    . C$ l; j' u' b8 Y# Reduced the dimension of training dataset using PCA
    # Y, a/ q" B# f8 _1 T" Z- ~+ Q/ Z. o% t
    train_reduced = pca.fit_transform(train)
    . T7 L% S% \5 l8 {* }; x) |  w! F) m+ i' O/ E( N* X! i
    #Reduced the dimension of test dataset
    ' z2 X. B3 A" y( m; @test_reduced = pca.transform(test)
    , c" d" m  o, Z& [6 @  L% C10.Gradient Boosing 和 AdaBoost9 g( ], |+ v6 T# ~
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    * `/ h5 B8 P; Q% g$ K8 P8 x  r$ k* d. _
    #Import Library2 {2 y9 ]9 g: \1 D
    from sklearn.ensemble import GradientBoostingClassifier2 Z# m' A3 [$ I' C
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    3 R. L- z$ l( d# Create Gradient Boosting Classifier object" F' w* X7 [! A
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0): L+ V8 C* C4 l& G# u, Z" B1 o

    : K1 @* U4 X+ O; b7 ?# Train the model using the training sets and check score% A) P/ ?% K. M" v1 b, i
    model.fit(X, y)2 z: Q1 v( f* U+ o
    #Predict Output4 i$ r- ]2 S9 B7 u8 t2 ~
    predicted= model.predict(x_test)# `- e" g9 O# ^8 h4 m1 Q6 c/ U
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    9 B; l' c1 D; |# m; B4 w+ d, Q" c2 z# L6 O3 |; H5 P- w. {0 A
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    $ {( G( B) _6 q% b. T% f( X% l————————————————
    * e; p# m+ R( r) F% c/ k" c  s版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . Q  C5 w. U- x8 {+ Z! p. j' m原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    5 g' R' x& m) W) s; V  B" C# G
    0 Z( _+ t4 X5 S8 D
    ! [+ H( C% A! R4 s
    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-9-8 07:50 , Processed in 0.559029 second(s), 50 queries .

    回顶部