QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2218|回复: 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
    ' m8 ^+ u* d2 R% k' k5 y
    机器学习算法整理(内含代码)
    & i4 [7 ?7 _  w' _' b8 R  S: r* q5 z# d8 z- s  O. R) T0 m+ s
    一般来说,机器学习有三种算法:9 {: N6 r% ]) H5 N
    ' g# P" {0 w8 D  p, i
    1.监督式学习$ F* J  @; w  w3 l( E
    ; v: Y! \$ u: ]' Z4 ^
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    * X# \; a# M1 _/ b# _7 d2 M$ D) h( h& y% l
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法" ^$ c* N) w7 I& u) ^1 W9 k

    5 x/ S# }" V# h" H2.无监督式算法
    ! w; H3 O  q! O" l$ Y! j2 n
    # k* H  A1 K2 N+ I8 D8 r, z9 N无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    % P6 p) |8 W! `9 {7 O$ {; j& q* b0 L; s+ }9 m7 _  }/ r
    属于无监督式学习的算法有:关联规则,K-means聚类算法等& \1 \9 {- A0 G; K7 S

    9 U" H$ P. J0 x3 }3.强化学习
    # \! c+ x: {7 f0 l" N, W2 g0 c# v/ g( e& G. J6 H. a0 D
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    & X6 L& D* W3 }; A6 M
    , d2 b; L- g; N7 m7 J, k8 u  Z属于强化学习的算法有:马尔可夫决策过程* l% V  l! J8 B. H6 r' P
    . x9 l7 |9 X" {, [8 Q) X/ v+ o& Z
    常见的机器学习算法有:3 w* f; T. \: [
    . Q2 l: a8 |' t# D  v
    ' Q, j  E  E+ F  ]2 B- k
    1.线性回归 (Linear Regression)# _" F* J# M$ s

    2 h2 ^3 X' P: ~2.逻辑回归 (Logistic Regression)3 E! v2 i+ |1 ^+ Y( |

    0 Z( I" A$ _  d5 w' O3.决策树 (Decision Tree)* X7 l# v  v* J& P% {; `" Q; ^
    5 I( v+ w7 S) \0 y
    4.支持向量机(SVM)
    $ k( J% I" m5 e- M3 M# y$ \
    ) E$ Q: s; Q- V6 n+ k9 F; R/ N3 L5.朴素贝叶斯 (Naive Bayes)$ P5 m, G0 P3 l% k) z" X

    + U4 g* o6 y# H7 g: O% s: {6.K邻近算法(KNN)
    4 x) R( ~4 j4 A" Q# l( y
    , k% I8 r. @2 v8 |7.K-均值算法(K-means)9 \9 g0 k6 I: a- m$ ]2 A
      E- y7 {% C4 f9 Z3 N
    8.随机森林 (Random Forest)/ Y- a. z" R" e

    ! H( W2 l' R- A! }" T% I9 ]+ M1 ]9.降低维度算法(Dimensionality Reduction Algorithms)
    ( @) r' `; Q/ l- e$ s
    1 I; {" Z* b* l0 [7 j10.Gradient Boost和Adaboost算法8 z0 b4 g# D( Q9 [( m* j( n
    一个一个来说:+ k/ L: e+ p5 ]- O- z) n  T
    1.线性回归3 X0 N6 P8 f5 u- a& P/ k
    ' \0 T; j" D- ~& x1 c" o
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    # ~+ }6 e9 g4 ?) U' X( K/ l
    3 |7 C9 I4 @$ u' z2 v* H1 T$ O0 H在这个Y=ax+b这个公式里:
    * I! N: F. s) ]2 W: [- A2 L3 D3 n; f6 H1 l, Q
    Y=因变量
    0 \7 X2 z0 A. V1 s# Y5 f
    : Z0 {/ |4 U9 n a =斜率5 e' Q. @8 q* n1 a8 R; b

    $ v' J9 y& y9 P: Y3 V, {6 p x=自变量8 w( Z' I' _7 d& y
    ! T0 v% }; j* a% h
    b=截距* A' h4 V) o1 Y

    ' X$ Z6 c0 G5 D' c$ M a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    3 N3 S  G. e! c8 Q1 t' c3 d& h- ^2 M# A2 A# }% H
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。8 t! t2 S/ ^4 j
    ) S% [' a7 m0 E- b6 ^# `
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    ) X+ l" S$ x  n; u1 x' ?0 P$ y- }5 m

    * M; U3 s3 x0 t1 B7 {1 z" m9 C& w  e0 z" d! |% `  S$ _- h
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    5 V: L4 D* P( J- Z2 t* o2 Y9 }) c6 B5 J
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    & h4 y) n, |+ T) d1 a# q- R$ S& f& a
    Import Library% Y+ g) l* a5 ^9 I" M4 C
    from sklearn import linear_model
    + V( h" e% U0 W# p3 v9 G7 G* E
    * n2 u  j( [3 K, f) v/ S7 Hx_train=input_variables_values_training_datasets& Q; d/ e( k8 V% z0 ~: j  v
    y_train=target_variables_values_training_datasets6 Y: v5 ~0 u' b% ~% O
    x_test=input_variables_values_test_datasets
    4 e& ?6 p' o0 T1 _7 |- L: R4 p' {* P
    # Create linear regression object0 ~& k5 p# S" v, X& r% Y% a
    linear = linear_model.LinearRegression()( d  [8 W! b0 h( p: a7 X
    ) \8 x3 i: l0 k9 g: \$ |
    # Train the model using the training sets and check score( Z9 W1 o. [: b% v
    linear.fit(x_train, y_train)% S2 r: g& ~! ^/ f+ e$ _
    linear.score(x_train, y_train)) u/ ^  A) l- W% T/ _* U

    ; L0 w: U, g! z- K( H$ e#Equation coefficient and Intercept
    : S) R! w" C5 l% ]# w0 g+ Mprint('Coefficient: \n', linear.coef_)
    , ?* U; l. `& F+ O* Qprint('Intercept: \n', linear.intercept_)! ^0 h) h* g2 }

    & S! x1 P+ j1 z1 u. H: l1 T#Predict Output
    % s- q+ K! T7 Q0 |' {) kpredicted= linear.predict(x_test)
    * m: b2 V2 `3 Q2.逻辑回归8 e& K. f1 p+ }* W
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!) a8 P& \" c: D; F( @

    ; |* K# q* F2 @% N8 ~同样用例子来理解:
    3 u+ }, w4 [  ^+ l" Z. N9 {2 X
    . b0 |# [  }. T9 k假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    : v# N/ Z' }5 ?$ ?) c) t% ~# e7 }0 n. y
    6 r% E/ D6 [/ Q: T数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    ) b& J+ ~* [6 y5 E. Y1 ]7 H1 j+ {: f+ u! x# e
    最终事件的预测变量的线性组合就是:' `! S& J/ R% }3 V! a
    7 P$ \' \! t: Z# [; }; C) B. `
    - c! C1 D3 E' B' @3 ^$ O' F  B( J9 W
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    9 @% D/ j) s0 \% `" o% B/ ]/ f' [9 J
    ln(odds) = ln(p/(1-p))
    4 _0 o, B( ~6 H% l& [& @& h! [' h
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    & g0 n1 V4 A" C- k. e在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    & C- S0 f. H$ g" s1 D. h( G. C7 D- f% d! E' L+ C' ]
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    & K$ G0 d3 T8 G) P, J/ s5 ~6 `% a' i; W
    2 s! G6 S+ i5 J* V; V0 K2 T5 B
    $ [7 }  \9 N- Z: u, z
    from sklearn.linear_model import LogisticRegression% X, ~# B3 y* ?
    3 h' m8 J6 [7 {2 C/ U. t7 F
    model = LogisticRegression()
    6 i1 |; U/ [1 m& ?: U$ l
    # |/ E( d! @( h; w # Train the model using the training sets and check score
    & n4 V2 q/ A+ a model.fit(X, y)0 {; b  l: \6 W5 i5 r7 Z$ |" |
    model.score(X, y)
    ( w0 f3 E( ^( ^( W9 r6 N  O) C9 ?, p. J$ g% j  y' o; N
    #Equation coefficient and Intercept7 L# B  ~0 m) p. s6 R9 T
    print('Coefficient: \n', model.coef_)
    * c/ W. S( l* T) y print('Intercept: \n', model.intercept_)
      t5 g0 S8 t; ~7 `! x$ q8 n& F/ O# e# C$ e
    #Predict Output, V$ L& e# I: ^. s- Z6 f* A
    predicted= model.predict(x_test)
    & k/ o; H! Z# ^, v! f逻辑回归的优化:
    - Z5 A8 h& X1 w/ A4 u加入交互项& k) W, K9 y. x
    ( B/ S# m0 x, ~8 J% O2 ^
      减少特征变量) r# D. f, W7 M5 S" ]

    # O: n! I; U* v- }1 H; ^  正则化
    9 V' R3 ]6 X' k) x8 Y( [* _# G
    % |0 A' E2 ]+ a( F) O  使用非线性模型
    3 j4 `% ^' e" g( K, s7 ]" k4 C8 \1 A
    9 N3 |. K8 n! c$ U3.决策树
    ! d: T, p' l7 w/ T: B! T这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。' E$ P6 ^; V# V8 X6 z

      a8 L, o6 u, s& U/ M/ a+ ^1 ], q# v+ t3 R0 m
    4 E3 y" G% H+ q7 E0 B7 x0 E
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    5 @" l5 y( C, s5 N% G" u* S& r' z3 s' N: O& h  @' |4 |

    : @. G7 r5 G$ V( F1 ?from sklearn import tree
    6 E2 C. {! K% h& b. u. r; n+ S2 @  S+ q2 b

    1 i: }4 W* X$ ^# J% E# Create tree object
    % v5 S7 W* B' u2 ymodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    1 ~5 A3 z3 Z& {+ k$ c8 H2 X: y3 c- t: f- ?) Q: e- S
    # model = tree.DecisionTreeRegressor() for regression2 K! w& G5 N4 Z, f: t- }  d

    , o4 n7 r4 g/ R$ ?4 o# Train the model using the training sets and check score
    ! H% i  G  i$ R% X! c# W/ Qmodel.fit(X, y)
    " C/ B6 k( A& p, V' h- ?8 p2 j8 fmodel.score(X, y)6 F6 ^/ C# _# T, U; \  W) e( ]5 _
    ( u, n4 s/ h. e8 c5 G: p
    #Predict Output8 e: v& L( y: J$ e+ x
    predicted= model.predict(x_test), M6 e/ j7 w' y2 ^, V& ?  A+ Z
    4. 支持向量机(SVM)5 I2 ~/ u" s9 Z2 R4 z) q" B, K
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    6 ~+ Q; P# [( m7 m3 X* u4 g) e. X0 K8 y' P- S& a' i4 R3 k
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。# k3 g' P7 i! p; I+ J0 W
    ) W  K* N1 f" q6 G8 b) v
    % S* T) t3 P" u  X7 L& w

    - Q  R9 I" U$ y$ l9 K% @6 T7 F在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    + ]5 y) c- N! t& g9 A  e5 X# D. y+ E5 |/ E2 K3 I1 p
    #Import Library: W! W) k- d- b9 k: h6 y& O) D
    from sklearn import svm  b" g7 Y  E9 ?' s0 u) W8 _' |: h* h
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : M1 j' @2 y3 a& \( V# Create SVM classification object 4 n% w; q3 h! A- a, B
    / S' Q, f$ h( \! m/ E! S; s" ?
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    5 e+ A7 M& A) k. F' m. E; r7 a1 G" W5 ]0 w) U
    # Train the model using the training sets and check score
    7 m/ s! |& N, E$ c4 [model.fit(X, y)* k6 ]' m' j1 n* e. R) d
    model.score(X, y), t. H/ y' ^% n& [! r  p$ B7 u

    2 ^8 i0 _/ j, Q, e2 }9 i) ]#Predict Output1 ?3 F" A7 C# g$ }, V) z6 L, o
    predicted= model.predict(x_test)4 d! z* I7 ]7 t, G+ h
    5. 朴素贝叶斯
    / m/ c" W! ~1 O4 D; B5 K这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。' \2 C, `: C/ K4 k
    ( u+ y/ R, K% W* R5 G( B; M/ b
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。/ Q, y, Q" T3 e. a6 n
    ; }1 Z  j8 `6 M* i
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    ( h2 q; c  @; T! V4 y/ q0 c5 F. r) E5 L. V" w; J& ~& L
    $ R1 P8 u3 c4 a7 Y! q, d  F
    P(c|x)是已知特征x而分类为c的后验概率。
    " A! p  Y. ^. s& Z: \
    . W3 u/ }+ |' m% ~4 W/ W- r' @P(c)是种类c的先验概率。/ H, x0 N. b: X
    6 K1 Z0 n" J( s2 _
    P(x|c)是种类c具有特征x的可能性。
    0 d" E# Z. Q5 C4 I7 p  L; f- M% m# e7 \; T# Z# E  `( ?
    P(x)是特征x的先验概率。
    4 U& m! y4 ~7 U( p
    0 F5 `) h) K- `8 w, y
    ) j( C& ?2 I: X6 A" c, p例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    5 S4 P* E/ {/ d/ d0 f: k# W) L5 H& |" i8 K
    步骤1:根据已知数据做频率表
    / s# I5 B' O) |; y* ]
    5 h- a& ~: g/ D步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.# h1 Z8 d" P' S/ @$ Q  Q
    , E; C0 b. x1 _/ Y

    7 B6 u1 A! H& {8 j0 e步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。, h# m4 T: r+ z* ?& i2 U
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    ( Q* H/ Q9 d  Q' g, ?" Z* S5 |, X+ Q0 s3 H, @* k
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。: N  D" ?% n. c- @+ v

    ) t; g5 ]2 R) S- v4 r这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    / ~6 p1 W- }( H9 m) Y* R; {4 U% p2 J, K# }% h6 `
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    2 T- X$ K8 t  L. E1 r* K, i; e5 w3 x6 x7 o+ e6 S7 j
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。! H' u4 o0 W! n) z$ h
    1 `: [) H" s( M
    #Import Library
    * ]2 E/ r8 _( a6 h/ ]2 Q4 C$ w: Kfrom sklearn.naive_bayes import GaussianNB
    ) L1 k& u& h9 a. X- ]& c$ [#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    - N  e9 F/ x& R" |$ [/ l8 e2 s5 X( B% W0 m
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link% F0 S8 _+ X$ m* W4 a, d0 O5 ]! `
    9 N* [" p! p9 W2 [) Y. P  f$ _  k, f' e
    # Train the model using the training sets and check score
      ]3 J0 e+ \  x5 W0 ~model.fit(X, y): s+ k6 l/ p5 \: V6 z
    8 m0 n/ u8 ^9 u( ~0 L8 N6 n
    #Predict Output
    - j- Y' L2 o1 U6 U0 Fpredicted= model.predict(x_test). P0 R% i% r+ @* A: ^
    6.KNN(K-邻近算法)
    7 e9 e. o/ ?8 C这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    + W: d( W6 B" Z& ^2 n# W( x8 p- T3 F
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。- |/ k9 q; }7 a( J2 i1 Z9 M
    # T2 ~1 E$ |6 u/ I7 O( Y' [

    4 G# r! j7 H* M: t( A: C2 U  e  T% U7 Q) f
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    2 e- I& c/ {1 ?; @$ y! ]! d" o
    7 }  a  x1 `6 P& V) n# ^& k在用KNN前你需要考虑到:
    9 n, O. N# b1 ~4 u8 d* V7 e1 n4 |1 o, ~' l) e) H. w
    KNN的计算成本很高
    * G/ J, O" }- _/ D" R2 X2 j: r% x! H1 n! W# {" w
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    / |/ e4 r( f* R" k+ Y( }
    ) U5 @4 h) F4 H/ _9 _) _6 @在进行KNN前预处理数据,例如去除异常值,噪音等。
    / B/ {- C7 s/ K$ k3 i. a; h+ m6 M7 w+ f/ x4 R' V$ g6 L& `; E
    #Import Library. V1 J  z# q( |; {, ]+ i  n7 p
    from sklearn.neighbors import KNeighborsClassifier
    " S1 @2 h0 O9 B! m) d! n! [* }/ c8 J) w
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    9 D* ?/ e* ]$ k% C, R7 B. o# Create KNeighbors classifier object model
    5 X: k. V9 K, T) r
    4 B7 }! y4 Z2 J  H: W5 \3 LKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    7 `5 a7 @' [) \9 B9 `7 S6 |" Q* Z2 N' d! }& A; P) k% m
    # Train the model using the training sets and check score0 d- I5 I; }! A" i$ D
    model.fit(X, y)2 ~6 Z/ ^: p% m5 W& C) s

    " _8 ~  n* ^3 L7 {#Predict Output
    $ l2 ]4 R! q* R( d( m' Vpredicted= model.predict(x_test)
    4 Y! `* E; G" O/ m( d+ {5 ]7 z# a1 T7. K均值算法(K-Means)2 a1 P- z( [& \+ S# {5 Y+ e
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    5 y- i% R/ }: n; [
    . A9 w! B- F; \1 L- o/ ?还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!. c1 c% m- A6 y$ U  c( F6 Z* H

    8 p1 `) a6 J  s) o: f1 O% m0 k1 p% w
    K均值算法如何划分集群:( x8 b& w# s% B  P
    - L9 H9 b0 O/ G, ?' ]' G9 J

    9 \8 L, u1 c5 j  C5 k, l- Q: @6 q( p8 f4 F( ]
    从每个集群中选取K个数据点作为质心(centroids)。  Q8 }. Z, o. N& U: j- t
    ! I+ ^5 K7 }$ X8 l0 |( Z) u4 r
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    9 b* U% [& p. X( B0 [. n6 f4 j- o. W! Q$ k2 j
    找出新集群的质心,这样就有了新的质心。, p  F7 M( a7 G/ Y, q

    7 x% F3 M! J" }7 ], {0 o重复2和3,直到结果收敛,即不再有新的质心出现。
    8 d$ q" \. b: L& P2 e5 D4 t* i# m
    ! [2 @- y8 Q7 |% J1 O
    . I5 q: Q5 i& }5 D) V( V怎样确定K的值:2 [: ]- ]! p) N) v5 e4 q) M+ c. v" J
    ; }3 l/ Z' [  U1 o, n9 [
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    - K' b9 f' d1 Z3 J' h7 @' _! E& x% K! E" G! M( ^( T! A
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。' g2 y2 [' ?- l3 y
    - u' e- w! `+ S9 t
    / h: S, p4 o. C3 x( ?
    #Import Library
    6 Z1 |2 v/ Y3 \( s8 ffrom sklearn.cluster import KMeans
    $ o. o* w4 w2 D, g5 }2 v
    9 S0 }5 U4 S. i# }% l#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset+ F& {" T" j. S" K
    # Create KNeighbors classifier object model 7 ^0 ~2 S: p7 \  f
    k_means = KMeans(n_clusters=3, random_state=0): H# {+ I( X7 a* t
    6 i0 d' x2 K- [& B$ @  X* }' Q
    # Train the model using the training sets and check score
    ' S% }  x0 i& r6 ^8 j" ymodel.fit(X)
    # f5 q, _3 u0 a3 @( q
    6 b( v& R$ G$ o! b5 L) e" w#Predict Output& J1 `" \  U2 _/ H
    predicted= model.predict(x_test)+ ^2 L. @& j3 ~
    8.随机森林: |0 n, Z' U- j3 W4 y
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。0 o- f# T: _$ D3 L

    * B5 `* |) S- U% ?: N怎样生成决策树:
    / Y- V  {+ ~6 l" F) ~6 w8 z
    - C+ S/ E; [* Y2 q+ {如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。6 c/ Y6 D! i8 C: g, Y, u7 N2 n

    # S& P; Q3 Y3 K, R1 L6 x, v如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。- @' s, s' k- W4 j1 m' X

    4 o* u3 f" t# v! ^6 }9 V. d每个决策树都最大程度上进行分割,没有剪枝。
    - ]3 m  t  ]# e  l/ O0 r5 r4 {: \( Q8 P; d0 K6 w5 \% d, ?
    #Import Library
    . d/ }: x# [; a, j6 Qfrom sklearn.ensemble import RandomForestClassifier: ]7 G% `- [; ?3 }6 F6 y9 a8 p
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset4 n! Z6 V, l7 w5 j% P; q
    6 x6 p4 b4 j# K) c" _
    # Create Random Forest object4 P; w* J1 \+ s& A* M( S2 [! w
    model= RandomForestClassifier()  N$ G+ a! t* h2 q2 O/ Y) t

    / [" G: {6 j" i" F& D# Train the model using the training sets and check score
    0 h: I' {  v$ O5 M% imodel.fit(X, y)4 m! E+ B8 v, r0 C
    ! V% \8 E9 {. y  r& L
    #Predict Output
    . Q5 O4 y. R2 m/ }4 Rpredicted= model.predict(x_test)
    $ g: h; X+ r' h9.降维算法(Dimensionality Reduction Algorithms)) d" P7 C$ U" F6 I) w! _9 ]
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
      l9 v3 c( J4 X, ], `6 J! X3 P
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    " x  H5 @* j+ F, H& a% s- m# h
    * B- g6 H  q& V0 _$ V作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    9 ~& Y$ T, ~" a' t) U$ Q/ b+ }! n1 I: J, |4 p+ v; z
    ) V: b+ e+ F  K" t
    #Import Library
    ) v1 t& f) r+ ^from sklearn import decomposition
    ! l* @* M. l  d- @& l4 s1 `#Assumed you have training and test data set as train and test' b# I9 {$ L. u4 ^3 E% X% U
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    $ S- _* t' s# ]' w# For Factor analysis
    9 z  ~2 T7 g2 J#fa= decomposition.FactorAnalysis()5 m+ \3 u' D4 W( P! B- l
    # Reduced the dimension of training dataset using PCA9 }. B# v6 \' R& [& I* B- H

    9 n  i( X* H4 K2 J& C% ytrain_reduced = pca.fit_transform(train)0 }. S0 O7 d  E$ ~

    $ m' H+ @8 J3 L4 X$ h. k* N#Reduced the dimension of test dataset- K; D3 c* w" B' R/ S1 [5 F# Y/ P
    test_reduced = pca.transform(test)  D6 h7 T% m( R2 e/ O. e3 m( l) o
    10.Gradient Boosing 和 AdaBoost
    % x* w* W1 O9 l2 ~1 V2 H8 T3 ^, xGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    - Z  S0 E1 L- L3 u# e$ z) C% Q( |2 S# s: D; r
    #Import Library
    - u3 s3 N! ^' m4 K! f9 h; tfrom sklearn.ensemble import GradientBoostingClassifier
    $ R# E- `( i" S5 ~' ~" t4 y# {& R#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    + V: J& q% P1 ]3 O! `9 V+ f# Create Gradient Boosting Classifier object
    ; Z$ D0 N9 O  c& L, hmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    # d1 C5 T# {) T# m
    " r( q) f: `0 R8 \/ ^* J# Train the model using the training sets and check score
    5 _8 M% y/ j, x/ Omodel.fit(X, y)
    0 J0 L, R0 u, ?7 L, A4 N#Predict Output# G& O! w. Z' P! ]/ T. n$ X
    predicted= model.predict(x_test)8 A: p, T( |; p! E5 ?; h: b! _
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。5 P& P( k7 F3 u1 h6 @

    1 |5 ]1 S& N* f7 H# c0 D原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ; u& R# _2 y" U3 K————————————————
    & ^! V' R) H: |; s9 e% f版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ _* {% a$ d6 ]原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075. X1 v  J" w1 a" n+ d

    * K, U! i/ f% D7 C0 `0 N  g1 T2 m8 o
    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-14 15:22 , Processed in 0.418538 second(s), 51 queries .

    回顶部