QQ登录

只需要一步,快速开始

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

    ) a4 B( V9 Z8 z3 h& ^机器学习算法整理(内含代码)
    4 p: s, L6 `) Q
    ! X8 K* i2 \8 p( P2 R一般来说,机器学习有三种算法:
      Q# V/ B4 {, S- Z, B2 T5 L
    / O: s% J3 L7 b' V1.监督式学习0 P0 }$ i* `  B/ l* J. y) Z

    ( N& m+ K9 R3 O: x# X. Z7 |8 n) u 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率2 F0 X( J5 B" V( s' w3 a

    4 j; a3 u; I1 c6 H" c属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法0 ~6 q/ x7 x' i5 D% S

    $ N4 p: j$ N/ e6 w) A2.无监督式算法
    $ F% s5 h, {  [0 k! B/ p. o2 y5 T% W3 s7 {0 Z( `! l- ~8 @& k( W1 N, g
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.) _8 v1 Y7 U4 j1 }" [) X1 ^" `

    1 p/ U8 r  `; E& r. z; G$ E8 f; j属于无监督式学习的算法有:关联规则,K-means聚类算法等
    ( T2 |: i& l) ~9 E  k& I% A  r
    % y7 N3 p; ~' k% u; U/ [6 R3.强化学习
    3 G, v) r, D9 K/ H# m9 Q7 L$ @) A0 k# ^5 i  O! l0 \0 R- ~2 S
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    # j, T; O; ]% `0 D8 G) U* h$ l! h3 K1 A0 J$ ?2 Q; b
    属于强化学习的算法有:马尔可夫决策过程& F+ w6 e' _% ~8 C' |) ?
    " i& {6 k( O( t8 t2 H, u# A3 r
    常见的机器学习算法有:
    ' ^$ E. P) n4 h& ^; x* _
    5 x8 V( ^9 q! h+ A$ v
    & g0 F9 v$ E$ R% F1 M1.线性回归 (Linear Regression)3 O2 O4 ~3 l  V7 \8 o: m

    $ Q; D" p* b2 T( {! x  A) C2 Q9 S2.逻辑回归 (Logistic Regression)
    - Z" z  U) y7 h6 _  v* {, h, F1 Z( y  M. X  X4 B
    3.决策树 (Decision Tree)
    0 p8 |$ V: g& q" ^$ E4 n* e. J( D* f
    ( ]) R4 m9 s/ f& e8 {' L4.支持向量机(SVM)/ o9 f+ K' C$ h9 l% `6 `/ _0 M: w
    ' Q+ J" \" z9 R% A, e3 r
    5.朴素贝叶斯 (Naive Bayes)0 K, x* \( @( H  z0 T* a

    8 c/ c8 s5 \1 I( t6.K邻近算法(KNN)
    ; g6 f! h" T6 z) ?6 y1 D  Y1 w: C+ G" f
    7.K-均值算法(K-means)
    0 o) H" k* P. w" p) O/ E1 q$ g6 D7 S- v5 s2 a5 A
    8.随机森林 (Random Forest)3 y  Y& P5 \, A1 J

    + c9 `- G7 m& Q4 O8 \3 j" t9.降低维度算法(Dimensionality Reduction Algorithms): @/ Y: y; ?  G4 S$ g0 P
    + O$ c% K* h+ S. B# x, `8 U
    10.Gradient Boost和Adaboost算法. N+ d9 N$ r, u3 o/ E8 R# p: x/ c
    一个一个来说:! n  c. X8 v$ |% z5 l( }) e% s! V0 v
    1.线性回归  ]* v( P( h3 T1 y6 b- C6 W
    7 n6 K. X0 r$ l9 I
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.2 _2 \# c1 x; D" p
    3 Q, {9 Y' f7 b$ [5 }5 p
    在这个Y=ax+b这个公式里:
    & q5 c2 A4 E/ o& A) Z4 ?! d2 ?1 _) {) Y
    Y=因变量
    8 T& s5 v5 j: ]: U2 O/ T
    ' {) Q: E( ]# P* D a =斜率: l; m2 g- Z5 E$ v' p8 J' o/ F4 _" N

    7 x/ G* e7 o9 p% F7 x x=自变量
    4 L# V' d9 H- n* I7 x, P6 j* y4 w; k7 q: z
    b=截距& p# t# Y# `) \5 M" I
    + J2 Y, G6 S/ x$ C* t
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)( j9 Y6 V% E2 I, X, a' L
    * p4 c8 R0 p0 n5 Q
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。+ {0 P; F  C2 b+ n( _( M0 S% ~
    ' t, C# S& Q* G8 |
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.8 ?! A9 W6 N5 e+ K' [; I
    ! T! _8 B( i  C/ ~4 R8 c! M1 J
    & h9 b7 i6 u. H# n' a: w' J

    ; W; w7 Y2 a7 W" [3 j. y( n( y. V线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.' S) }3 X7 J0 P; m/ @! `

    ( y/ l4 t4 u0 J! U  v; S拟合多元线性回归的时候,可以利用多项式回归或曲线回归) a! p0 V- L* o
    1 M) Q$ V0 }$ F% i8 s3 e
    Import Library# x' J* }% H' n4 E! z
    from sklearn import linear_model- J" u  O% x8 c& ~4 d: a

    6 W  g6 q8 C2 O2 _/ Nx_train=input_variables_values_training_datasets. y% A; ^. p0 R) R5 Q  F2 A  c2 O
    y_train=target_variables_values_training_datasets5 I2 b. R% ^) N) Q  r
    x_test=input_variables_values_test_datasets- d. i/ J( h# t1 l/ I  u4 G

    , [; l9 b* ?4 G) D# Create linear regression object( J. [8 W( {' H) M
    linear = linear_model.LinearRegression()2 l6 S. g1 y1 V! _7 D# G/ L; f! l% }

    4 h& Z( I7 k+ m# Train the model using the training sets and check score
    2 b  `9 Z5 O5 L! G/ P* Q& }+ zlinear.fit(x_train, y_train)
    8 c1 D% ~+ m1 \# g8 ]: Ilinear.score(x_train, y_train)! ~8 q/ S: z/ r# q

    ; B2 V( h: i2 \" D#Equation coefficient and Intercept" m! t7 M0 r# ?# E! ^$ a% j( G7 k
    print('Coefficient: \n', linear.coef_)
    ; G" b& G. g2 `% _& ~0 X  [: Dprint('Intercept: \n', linear.intercept_)
    * a& Q  k# k* L# `+ W8 N4 s5 L# K" y  g; F, ]7 i3 W2 j% H
    #Predict Output
    - X6 M+ M5 G( r0 M' \; d8 jpredicted= linear.predict(x_test). J. r' U& z5 w1 u+ y
    2.逻辑回归- n: Q( W8 w6 s% \; {7 f2 q
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    8 y9 l& }& V' }) H* ]
    ! [" [; P* v1 B! P/ Y5 }% \同样用例子来理解:
    ) B9 ^; W9 i  K% k  ~& \9 a: @6 c3 J: x8 `% N* h# [3 `
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。+ C4 T" ]7 o3 m( w3 N

    - I3 Q" p5 j7 h数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧. B' t1 [( F; A; k) n# Z

    + c. ^6 f# q/ ?8 u3 `- H最终事件的预测变量的线性组合就是:4 G6 ?+ p5 Q* }- D2 W+ m! h

    # @, W! s6 [2 Q4 K0 |' i
    9 i. p; p& F8 Modds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    # p# `* z$ `4 m. t$ x# z6 e
    % U; N9 k( m5 G  q3 v' Aln(odds) = ln(p/(1-p))! \' Q! {4 \3 |

    2 Y0 `; ]0 c6 t( h: B( p" g( Jlogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk3 N& W+ [$ c9 H" \$ z) V
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.7 q4 Q8 B2 e! x; T

    , j: k) Z1 o5 k. Q3 e; q* j% Y至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.: l" {/ w, _, Q; a7 E! p  e5 X
    3 @) B" Y7 A6 k+ @" R

    4 y$ L: h; F2 h+ F  l, w: I) Y3 c  G8 I- f5 o4 O( Y! }
    from sklearn.linear_model import LogisticRegression
    . i! L% R; ?0 ]0 O0 H+ u9 Q" U& H1 T
    model = LogisticRegression()2 ~) w0 ?* g) Y  ^: [& q. ?/ @
    " x% |7 b0 Q( T+ }/ a, O
    # Train the model using the training sets and check score; {" N' ?& X4 H  B! b! w
    model.fit(X, y)
    , I4 ~9 p/ V" X8 L, D; H( I model.score(X, y)
    + Y1 A( A+ D: U+ r( P/ A1 }4 ?' z: f
    5 f+ i- v  N  e$ v #Equation coefficient and Intercept/ s' [$ I& i" D, P5 f
    print('Coefficient: \n', model.coef_)& [6 M1 p6 j" A; a0 R5 j
    print('Intercept: \n', model.intercept_)  o# {, X  o6 P( `% Q$ B/ }

    2 H! V% t# a" T4 M #Predict Output0 a" L& a7 K1 Q1 Y8 p
    predicted= model.predict(x_test)
    . u+ a* }" g: M, c! z逻辑回归的优化:
    / \: @0 f; @0 i- c加入交互项- u7 y8 w9 m, K; t' y4 H6 E! k

    - k, |) a& m' T/ v  减少特征变量
    ' ~0 q5 @2 O7 _" V% }
    & \# O' y# y+ R$ Z1 P% h) F# K% d* E  正则化
    1 W) k( x$ t2 |* f
    ( X' ^0 ^- r6 F& v* `. J+ I, {  使用非线性模型
    5 Y# M/ t4 Z, H. @7 R8 [4 b; c& M( R- n- E- Q+ Q
    3.决策树
    1 v& V9 Q& {$ g, \, r这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。+ d$ D2 C- q2 l% I& D) Q

    4 `  \/ G1 P" o% Y% \2 k
    3 l& V8 n8 }2 u$ ?; f% T0 o
    , b+ V# R0 S% b/ k从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。2 K1 ~# |* R: l6 i0 K, s0 i

    & Z2 J9 D- i5 F+ G' B- F. W' F& m0 f* Q1 S1 r: |# q* U
    from sklearn import tree3 g  l. P/ b% T2 j2 O/ ~6 z
    6 L1 Z3 J8 J9 B9 L0 Y" b" v( f( R+ e
    9 U8 _( T% W2 u& a& E. Q
    # Create tree object
    # V1 J" y3 P! l8 C6 V% jmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    ( M- k4 Q1 S6 B9 T: X
    $ d6 y( C  z) C# L8 G# model = tree.DecisionTreeRegressor() for regression" A! \$ ^) B" U/ n5 r, z5 c8 ]4 ]

    3 e& Z2 v% f4 o8 g' n# Train the model using the training sets and check score8 x3 r% H# J# F; ~
    model.fit(X, y)! u3 S. M+ c0 K) `: Q: A  y6 t
    model.score(X, y)+ g/ V* F& g- X+ Y0 \

    4 P: A8 m  E' d+ m8 T4 e#Predict Output
    6 t" }, u2 j! \predicted= model.predict(x_test)
    . w' \9 b& ~; }4. 支持向量机(SVM)
    7 \% |/ {- U) k2 ^这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。; b) A6 {6 H, H2 h) k1 e; B% f
    ' t; s6 }0 o3 \# _' n  a  X5 n) w' X
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。: Q9 g) H0 e9 c, |' Q

    ( D6 ^9 l$ A  S9 M2 P+ v2 ^* u" n2 [* m: B* P$ V
      c/ l& F' F, R' J
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    0 C2 q( j3 u1 X2 p% F
    / {( e0 N2 d0 }, F7 T+ s#Import Library
    ' B+ ]7 m9 p# \" Sfrom sklearn import svm
    9 R! e: [7 B: w* o. ?0 x, g. P! b#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    9 ]4 T# R; H8 [6 T# Create SVM classification object ; s2 n! J& S) p

    . f  V$ }3 L7 lmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    & \' s, s, M% |( ^  {7 k# @9 ?+ l' `$ O3 U" ?
    # Train the model using the training sets and check score6 U3 V* p6 q+ D. P
    model.fit(X, y)
    9 J. h2 h& {0 o& Kmodel.score(X, y)& ?! }6 A' ~7 O8 A$ ~2 `& m" E

    4 R" d) M. e+ Y3 a3 j7 r#Predict Output% s8 M# n: D! ~# Z% i
    predicted= model.predict(x_test)7 f* }2 t% {+ V( ]
    5. 朴素贝叶斯
    9 N- C2 a/ Q2 \  p0 R. D这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。9 ^# C' L) R. h9 C  i
    $ [# u( j6 L' _! U% F# J& b$ I% K! |' d
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    & ]3 h7 J; L& P6 M
    ) R; i! r  i- a" ~1 M贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    ! u7 d5 q( }0 w6 a# @8 T
    2 t% \3 |/ b7 X1 H% p: e7 o" b* T: P5 U& u. s: V
    P(c|x)是已知特征x而分类为c的后验概率。6 u8 W' M$ X4 k. ?
    2 t6 p* ~, X  g7 c
    P(c)是种类c的先验概率。4 n- R( Z5 t; j+ |3 X
    $ n* w: g: a! z( T4 S
    P(x|c)是种类c具有特征x的可能性。
      O& j* H3 B4 M5 o- f- |0 n
    % v6 a6 R0 ~5 pP(x)是特征x的先验概率。
    2 k3 R  d3 l, V! S' d
    : W" c' Q0 p5 K" T- Y0 D+ T2 d5 ^8 X1 ~! g3 D+ `+ O
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:9 l5 I" L! i+ M( ?# x

    + _0 _( c  r0 }4 X" d- R步骤1:根据已知数据做频率表# s/ j6 y5 p8 n9 ?" `2 A! D

    0 L* A: Q: z0 D步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.3 ^) V& K: ~' t+ R
    , Y8 e: T3 u4 |/ t" `- o

    ) K+ J0 A! V- I" ?步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。: q. d7 f1 F& A! H0 _$ {
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?2 n4 ]+ i6 M% k$ y

    " |2 g. j7 G4 B4 M% t( L- Z1 e我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。' z6 s, W: D0 u, o  f& l) ~- W

    $ M! k5 |' O7 _, L+ g) ~这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    6 e2 k, g3 k" F* M, g1 ^2 _& m9 q0 u2 e* c' G& t
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
      I( H. Z1 B' {& c1 U# P; i1 F7 y7 e) B" O* p# U# A1 X2 T0 Z, B
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    3 o4 {* [5 T1 O( ^% H( y
    $ k( r1 }+ z+ ]* u- I" }, }#Import Library
    ( L* r# U) Y4 A! ffrom sklearn.naive_bayes import GaussianNB2 T% Q4 f" J$ F2 C  J: q( p
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      N" _) o6 {+ q1 Z
    ! a/ [3 Y$ a9 z/ u) I# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    9 B* r# N/ [* E! s
    1 P/ s: U: O0 ]8 R& U9 D& i) h# Train the model using the training sets and check score/ h. w6 e$ T1 B( O
    model.fit(X, y)
    8 o! v6 D8 l" {- h/ [2 H9 ^$ Z; w/ d( M% c
    #Predict Output" Q, ]1 A- Q% K6 R. W: {% d' J
    predicted= model.predict(x_test)5 |: P! p8 e* \* B, _# O( i& J
    6.KNN(K-邻近算法)( z' w8 x+ Z4 h. b* \$ u1 L$ Z2 s( f
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。3 ?2 \" I4 m( j8 @$ a5 z6 d1 l

    3 j. y- B9 T, W- k9 \# q距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。2 u* A; g" W: o# d0 |: w; k
    8 V" \7 b: d2 @" i) f: u: Z

    ( p5 ^+ i$ n+ z, c/ R) y9 A1 }: I9 f0 G' N7 `* z; z
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。; `$ t7 Q7 `' L' d
    ) g& N; u1 \  P3 F; C' L; }
    在用KNN前你需要考虑到:
    ( f! i& E% n  m
    : I' M( g  ~& g2 _3 r) AKNN的计算成本很高( s! m. l$ k' V
    & p4 s+ k1 s& [4 u( O( E" [
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。4 {8 G$ v9 v' y1 |2 M- `
    % ?& d$ f2 }, h
    在进行KNN前预处理数据,例如去除异常值,噪音等。* u# T& x) r* J$ p6 \6 B6 }
    - r0 b" w& s7 a/ E/ K* @4 Q' |1 `& A
    #Import Library4 A+ i# U* {4 u7 ~) x
    from sklearn.neighbors import KNeighborsClassifier
    0 t: l% n; \* p  n+ A8 _
    " o9 c" A- z8 e' L2 r# B* X) B#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    . E. J- p2 a% T. m) ?; Q7 c# Create KNeighbors classifier object model ! |* B# y5 F# d- }
    5 f9 h, \" y4 j' ?
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 52 \8 C/ j8 [9 P8 s  D& A1 o
    , ]& N8 D- I" d8 D* _+ \- t
    # Train the model using the training sets and check score
    4 i0 G% O1 y0 ?$ t+ F$ n: E1 a' Emodel.fit(X, y)
    9 y% ?& Z/ o% n) z* y" z1 D$ s# s  j# Z" [4 j+ v; I: _
    #Predict Output, \, x5 f2 d  _7 g
    predicted= model.predict(x_test)5 I3 Z8 _, _- j
    7. K均值算法(K-Means)7 @* Q9 u& @7 T9 S, ^8 F
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。  @- Q+ L9 u7 K

    2 e- K9 b& c* I! C$ K& G+ W- r还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    ) h; D( N1 i* R/ A# g; U
    ; o# u3 j+ X  r, ]5 _# x
    ! [7 u3 b4 E5 b% N% tK均值算法如何划分集群:
    . v  x7 _/ ^6 _3 j+ K& c' o1 G) ]- f& b( x7 R* s

    , `9 Q0 d* [+ B
    2 k6 E. V/ ?# J* s" Q/ B# K% U从每个集群中选取K个数据点作为质心(centroids)。
    ; C8 l" d: F* H0 ]7 I1 ?3 B, U
    3 W  E! J: N; m' h+ i9 c" A0 p* y: R将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。( F8 b' \( r4 l3 ?% D: F7 i/ [4 T# b

    ( u6 @! |, t( q) [) o: E找出新集群的质心,这样就有了新的质心。+ F( v1 `5 t6 [6 k- I( e% R$ N7 w$ b

    9 U) i$ y0 e& S" v, C: i8 }6 g重复2和3,直到结果收敛,即不再有新的质心出现。
    5 T! _8 q3 ?( g) ]( j" ^! Q% V8 z) u  N& Z/ v
    ' H" n  p5 b- f# }& W& [2 T! C3 ?
    怎样确定K的值:7 i# D- f: P4 K5 J* c' n8 k# a0 o
    ' ?, x- e. ~1 w: S# ?: H! m! h
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    ' I9 m' x4 f& B9 g* v* M- v8 m+ L4 E1 F& `5 |
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。: D& @1 |1 L* v
    , N% w6 T+ O4 D% B

    1 Y  B+ p1 o8 H8 d#Import Library* r2 R) ^: w- }$ d/ l7 R$ O1 v
    from sklearn.cluster import KMeans. _; z4 n! l) A5 p3 A- r4 n4 N; A
    / a9 I# D: ?1 m+ A$ q$ G( x5 V
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset8 E4 h# C0 {0 u5 w
    # Create KNeighbors classifier object model
    # L) A9 o) w7 X7 v) ]8 Z* [' l% tk_means = KMeans(n_clusters=3, random_state=0)
    " o/ v5 T8 u+ f) @
    0 j( p4 g: g3 H" S) Q! H/ T# b# Train the model using the training sets and check score4 B7 t( a- ~/ t9 G8 ?9 }/ w
    model.fit(X)
    ( E) I9 f) o% U4 w' t) ]) |8 x. F% T" V$ C" {2 M8 A3 y
    #Predict Output  y, V" x( F% X, I
    predicted= model.predict(x_test)
    5 W4 J" S" z9 Q7 Q& V0 L4 _' _% V8.随机森林
    * |. B. n! l5 t% J9 I随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    7 D3 Y! B, m8 k5 n1 _# o
    ) \  {1 B0 f3 w) [$ H! X/ k: u怎样生成决策树:
    1 f: g; u! D6 ?) B% ~# l( E8 `/ z- z6 w6 U' y
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。! K* o9 x! l/ d7 b( z* h
    . {3 @8 C0 L" e4 F" e' L
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。! G. K$ v" Y" m1 p
    - |7 F/ `& C& q+ \# P
    每个决策树都最大程度上进行分割,没有剪枝。0 R# u* S9 k  @" V0 W3 x. S4 E
    2 ?3 y8 w6 A, o1 Y
    #Import Library
    - z6 G+ h( u3 ]- M7 D$ c- Y, qfrom sklearn.ensemble import RandomForestClassifier
    # }7 a0 H$ }% r# l3 e% U9 }) I#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# c7 d/ y6 J3 o' K! U5 G
    + D- U+ q% `+ y4 \
    # Create Random Forest object1 a, j. E7 }4 l* l3 l
    model= RandomForestClassifier()
    & h& k7 k0 {8 ~: \. s
    3 ~5 m2 U9 ^* Z4 h; t* i# Train the model using the training sets and check score3 M+ m' d* L. H- y: z
    model.fit(X, y)3 I7 u! q" g  U, M" `9 h
    / W$ m, `  z) E& n- Z4 C9 J- F
    #Predict Output
    0 k: L: o# k$ M0 F- i+ f* Hpredicted= model.predict(x_test)
    ( V+ T4 o4 @" k6 Z9.降维算法(Dimensionality Reduction Algorithms)
    4 Q8 H" a. J+ d4 w8 o4 w9 ]7 z在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。- U, Q0 Z; f  B! [/ x* @6 n5 f
    ) S: e  u$ F5 X: }+ h! \, g
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    / D4 ]8 Y' e- n9 k4 t- t) ]0 g
    " k# \7 ~0 ^; e, n, s作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    7 w0 X" e; ^) v& ~" s
    & x. J# ~# S! |
    5 L: H5 A! N8 V0 Y#Import Library- a. e" L6 K7 R
    from sklearn import decomposition4 ]+ N3 M7 A  O9 J  [
    #Assumed you have training and test data set as train and test
    , h& h) b: ~. W( d# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    , V. l8 F( o7 E" l$ t% t2 E# For Factor analysis" r, P  x7 e+ G  j7 T8 p
    #fa= decomposition.FactorAnalysis()
    - q& }# I" r+ R# Reduced the dimension of training dataset using PCA
    ; v7 O6 i9 M* R5 B' v+ p
    & P1 Z4 T6 }! A% R  ?train_reduced = pca.fit_transform(train)9 X7 z  p: |$ m# m
    ! c& h1 t6 `) U
    #Reduced the dimension of test dataset) O/ x! N; D" b- h
    test_reduced = pca.transform(test); X) d* |0 q0 U* `3 f+ `' o+ h
    10.Gradient Boosing 和 AdaBoost8 P: E) \" \( I; x8 z
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    7 D% u7 h" t- K; [2 |% B- @  C$ q' }! m- _1 |( u7 ]
    #Import Library" d+ W0 G) @* s. G6 e. [
    from sklearn.ensemble import GradientBoostingClassifier5 E$ {' |& o; _* H+ j8 J
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    6 X! C8 J. H* s$ F" ~  L6 J9 U' I# Create Gradient Boosting Classifier object
    0 ]- W5 ^& F, ?6 `# s6 v) W* Wmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    ; [1 T9 g& o) N- f3 ]# j% L1 z" n& J
    # Train the model using the training sets and check score+ e4 A3 `5 v3 o- y% b1 m' d2 e
    model.fit(X, y)
    % Q/ v' y( ^3 g8 H. H#Predict Output
    * d. Y' p# U6 J; z+ |1 ]predicted= model.predict(x_test)2 r4 e1 @$ i7 w+ J+ W8 \' ?+ D/ e5 `
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    , a" K: g# B- s- U, X( W, N' l- f9 C0 r6 u4 w9 h
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    % K3 I0 p  o% W/ s) ]9 I/ w————————————————
    ) X0 m. k* B& G' L1 m* D8 j8 Y版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + P, |+ W8 e4 [) \+ q1 R/ t, Y原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075. B  p  p. ?! ]( n9 t5 l' e$ l

    3 P' P4 w4 Y+ n* P+ M0 E0 g) }/ b
    ; m( v; j6 A( M" S5 |) _/ g
    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:59 , Processed in 0.235405 second(s), 51 queries .

    回顶部