QQ登录

只需要一步,快速开始

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

    * G1 V7 }; I4 d/ a% S+ H, Q* t/ P, {机器学习算法整理(内含代码)
    " z' m5 t7 z8 f, |) Y! t( V! d, P! W& k) X) }
    一般来说,机器学习有三种算法:
    , J: t( S' W1 M7 x. ~! E. F
    0 L" d0 [( r. N; y6 y- v- B1.监督式学习3 S" U9 t7 M+ I8 {1 N) N; |
    ( }% q$ w7 C( c. \+ @
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率) ?( S' g  e  f( g* x4 k
    ) Z3 E  V0 [4 F2 _
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法- ?) d1 u# T! z9 s& X" C
    % e6 I  `/ \$ G, t$ `7 s, e
    2.无监督式算法8 g1 z8 [& O$ f

    % j+ u9 z6 \( }6 K$ j- I' Q$ c$ r无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    % d2 s! ?7 B+ c& \' r
    & ?+ W- X' n/ _属于无监督式学习的算法有:关联规则,K-means聚类算法等$ t* m/ g( o: L( c) ?

    ' e( o/ d- H+ u3 q5 J$ n3.强化学习
    7 u5 G: a' D  b( y. r7 S. C
    / n3 H7 i! O* q' p) O9 ~这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定' g2 N/ R# E' I' [7 m. }

    ! g! J. v) D! K0 _属于强化学习的算法有:马尔可夫决策过程$ X9 g/ S( P' i# M
    * [4 e4 e- M3 F- M. I" r' R
    常见的机器学习算法有:0 X7 w, T1 O; f; k- H
    + g: d" m4 f4 g! r+ C
    % y) v8 F! y2 L/ L9 {
    1.线性回归 (Linear Regression)9 v4 U9 q8 R) |" s9 u' N" k
    ( k$ b$ m& d/ r8 K9 d' J$ b( J
    2.逻辑回归 (Logistic Regression)1 e! O- s0 P7 O6 k( L0 |

    % F& r4 T2 G9 g3.决策树 (Decision Tree)8 M3 J, I' h* R7 w

    & m9 z* t7 N4 c8 z7 l( Y, ^/ B4.支持向量机(SVM)
    ) N, D. \& _( y0 K$ i- X- w( p& _; O
    5.朴素贝叶斯 (Naive Bayes)
    . ?) k) I2 ^* p9 O% X3 ^5 G! v1 {$ U: z; c* n: N' C
    6.K邻近算法(KNN)
    7 I% {* U3 S0 K3 _  m6 x$ j: ^1 d' v1 H) U: N5 _8 b
    7.K-均值算法(K-means)3 q) q" g( M9 u! P) j

    7 E6 @4 P% E( ?. [8.随机森林 (Random Forest)
    1 z) m3 V; e; L5 \% K5 W
    5 ^$ f! v- E4 h7 @, x# a6 }8 H' O9.降低维度算法(Dimensionality Reduction Algorithms)5 H. C& R$ H/ F8 s

    3 g) I# D8 q  W9 ]1 A+ {% _; M9 N10.Gradient Boost和Adaboost算法
    2 [8 ^: J" t/ [+ ]" P& a# H一个一个来说:$ [* g+ z  ^' L" m+ G+ q
    1.线性回归
    4 b  O, y% [1 [  ?8 d; X+ {) |1 O
    1 N! x5 l: h1 U; X线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.. Z( j3 u3 Y; A9 x5 s8 K

    1 |% z! J! i: u8 y' D+ e# Z在这个Y=ax+b这个公式里:$ Q! D; G6 h. U- i
    + n6 S7 v% j$ f" a
    Y=因变量( b, O8 w7 G, @$ ?

    3 A! M: K. S: o, ?/ e6 B5 X a =斜率
    0 P6 V( O! Y* I. p6 a: d- P  H  \) i/ Y. l! H2 a
    x=自变量
    ) ~, Z  U7 {& }% u  Y
      S( M" o" Q4 @9 h b=截距* ?6 A6 \4 d7 k: X$ v5 B4 J& e

    4 p( |& w2 m1 C( a$ y a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    3 r  M+ l2 E( Q: B! a& @
    . x) m# g2 O( @3 O7 P& F我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
      D+ G9 C  X1 g. l( f: K. F" y) z
    ! k8 k& c; U! i! Y- ~& W, F给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    6 V4 A* [! m/ i9 N$ C. s4 ~- E" |1 s  u% d2 ?0 _9 U3 R8 c) t0 x! Q

    3 @' v. W9 v; H% T: x( u) W5 y! y  X! E4 ~4 U$ H, P+ V
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    ) E3 x7 u8 @, h& \. f
    0 E: D! I8 U5 h; W+ F$ ^. v拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    . |; i6 I7 G! i; a+ b- e! G8 O7 A! F  @3 j
    Import Library* b$ u' b  E7 H" c* ?
    from sklearn import linear_model
    $ a' h, z- j8 J
    : ]5 p5 K6 A5 v) J9 J. p& \x_train=input_variables_values_training_datasets
    6 z; L8 H  u# L" T7 Wy_train=target_variables_values_training_datasets5 I, ^3 X  s% D/ k! }1 C; Z5 C6 _
    x_test=input_variables_values_test_datasets
    1 F0 ]! y2 y% Y: k8 S; z5 I
    7 z# E6 l7 Y4 |6 U# Create linear regression object
    , E; _% Q  a" {2 E0 S+ Vlinear = linear_model.LinearRegression()
    2 Y! D+ L8 B- T4 r2 T3 n
    8 M5 o. A2 i' T$ g' s: K# Train the model using the training sets and check score2 l# q  A1 T- x3 w
    linear.fit(x_train, y_train)0 ^9 J9 |, a7 y- V
    linear.score(x_train, y_train)
    5 H# y5 K0 K2 H/ N- m
    " w& F3 R0 H  ]#Equation coefficient and Intercept
    # j+ E; A9 k/ S, Yprint('Coefficient: \n', linear.coef_)0 ]. F4 t6 R; u: X& W
    print('Intercept: \n', linear.intercept_)
    8 T/ E% M/ b0 l  l8 {+ d  d/ `) V6 \) ?! E; ?( P
    #Predict Output
    ! R+ ?2 ]% p; `predicted= linear.predict(x_test)
    - K  a" V, y- s- o2.逻辑回归9 c( E) D: I3 Q  {3 b" {  y6 q
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!2 i: v0 y7 V3 b2 {+ T" K- s
    . T' E9 o$ h( k
    同样用例子来理解:
    1 s/ Z! a: H6 ?: l. f
    ! K7 w$ G# k6 c2 b; d$ E( U6 X* |! j6 B假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。5 X4 V3 k5 g# l. t; B6 B/ N

    + }0 O0 L7 F9 C) p* ?8 w; L) [数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    / B$ t+ I" J" |5 d4 t+ ]4 }! p% F/ X" G# p& Z
    最终事件的预测变量的线性组合就是:
    3 X# H# \$ e( y( N) S4 e6 @) F) X# u. j# p' K

    / T3 j* h( K$ m4 F$ zodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence$ L/ s% U% {2 Z% t3 }' r; H# j! A! z

    9 b4 p8 d. I$ ?% _( d- f/ h" m7 H) {ln(odds) = ln(p/(1-p))
    5 ^. v2 S0 B7 H- B7 B3 _! z/ ?: |9 y' Q: u; E; K8 p6 @
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    $ I& v- r& o) {8 b# h& r* |5 G在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.1 ]* V" p* F6 o4 {& A
    ; y7 K9 K- k: J+ m1 R
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.7 m0 n8 G9 u# {) P( }
    , I/ G" D2 Z9 u2 U6 a+ `
    1 M3 U) X: Q- b& d

    7 U' ^8 g1 _. X  @2 k! W2 x0 y from sklearn.linear_model import LogisticRegression
    7 N$ \% D. A1 ^1 M7 V- ^, d5 g  z& p* A
    model = LogisticRegression()1 E; [2 m5 X9 j! S! O! \
    : ]/ Z) J7 I0 i' b7 x
    # Train the model using the training sets and check score# T4 ~/ ]# S# V6 V/ _7 i5 y4 p
    model.fit(X, y)# s1 b, a  x* {% ?5 m8 `2 t
    model.score(X, y)
    7 n/ R' }* ?8 k' F+ z2 N1 H: Q8 ~  n# H: v+ ~; R. C  g5 ~- s
    #Equation coefficient and Intercept5 y# r  \9 F+ a' w* ]  Y0 d
    print('Coefficient: \n', model.coef_)
    ( [. X$ E1 |3 U print('Intercept: \n', model.intercept_)
    4 D1 E, T& x  \% e0 q6 c6 r4 z8 o5 R/ L9 E
    #Predict Output
    + h8 d9 x5 R5 k3 P' M predicted= model.predict(x_test)
    4 K% y7 o0 J/ \5 M; G$ X9 T( |: c逻辑回归的优化:: ]5 k9 I- \2 S2 t6 a4 M
    加入交互项
    * w( o6 a+ Q7 m9 z  z- ^  ~
    ! d# ~% u3 @5 P( q  减少特征变量
      z. F( [( O% i/ B* P4 F* J
    3 ]2 r$ g/ ?7 D7 m' x4 x6 B  正则化
    ' T' W5 h+ y9 ?3 w$ [
    6 |3 K: V# ?  s0 n; J  使用非线性模型
    / O+ U: ]( K& H
    $ K3 A, I2 D- b0 s4 f- ]* t3.决策树6 E) L7 x8 Q1 u" E
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    # h, y8 Q. [# t$ a: V5 J: i9 _0 x' G5 N6 q# l, V/ \& ?# }" o
    2 S+ I/ f: w1 }9 I3 N! z

    ) n  o; U7 F8 H2 ~8 o( F5 B7 P从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    ( {3 ^# v2 g4 G+ S2 V6 C& G" I. F) {6 [! |. Z. t3 m
    5 E4 |; ]( R4 G  h
    from sklearn import tree: l7 f1 C& u& r/ F4 d
    , C9 q6 |& s4 n3 |6 _# k
    9 ?; c6 n5 B7 I. p) b* Y
    # Create tree object
    # V+ q4 x  M7 C# ^model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  9 g- X* }. z: B# Z; b1 y* U' ?( S# L, ^

    + ~: T- i: Q+ J$ P4 ~# model = tree.DecisionTreeRegressor() for regression2 X9 n. e9 }6 Q8 E, W* @( e4 d+ x
    6 Q' V' q: P" D3 B, L; [
    # Train the model using the training sets and check score
    0 Y5 v+ m1 f1 r  V7 e7 dmodel.fit(X, y)
      z" @% ^4 K( l* Gmodel.score(X, y). H( A# E  {) V6 x
    & g/ C$ Y  {$ P4 P% O0 B6 Z4 M7 S
    #Predict Output
    - x+ N4 V( o  s9 t9 d( Apredicted= model.predict(x_test)
    - j+ c  V; x  ^: t5 f& F4. 支持向量机(SVM)/ F1 M0 c8 V6 `6 F/ i- O) v0 ?) {, M
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。. z: N& j0 R- H/ x8 }
    5 `) V4 f  R( f2 v- u
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。8 ]  {0 v. S' I; Z, l
    5 `' ]9 {6 U4 f; j+ K0 z" K: G
    3 A9 y6 g( e: [8 ^1 G2 W

    6 A2 y, [! @# V. R1 v$ K; }" o- C在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    0 ]- V& I: Y- n1 _
    2 s7 k9 H; O  A1 g% |& Y#Import Library
    : W% s- y5 K8 W/ Vfrom sklearn import svm) _- o( U$ _$ ^
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset7 Q+ F7 h5 K4 X7 W% \- H! \2 ?
    # Create SVM classification object & b5 I! r+ r  e7 i4 c" v; X% h

    ! I* Q% d6 d/ w( q0 T7 Vmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.$ [3 _! o/ h$ ?- ?

    - ~+ p! w! S$ }% m* y4 f* Q/ L# Train the model using the training sets and check score, H$ O" E- ~! x
    model.fit(X, y)
    , P; I8 ], ]$ }4 T0 {  f7 s2 U. ~model.score(X, y)
    1 a: P1 T1 s0 @+ a& p( ?6 ]. |. o0 T  S1 n0 u; g& c  x
    #Predict Output- L& A9 M3 {5 y! ^% z0 ~5 }' h9 S
    predicted= model.predict(x_test)
    # @& m4 d# @. r1 I  m2 y5 q+ D5. 朴素贝叶斯
    , r+ I. P9 ?1 \/ q$ g, J2 t8 q这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。; \2 j2 g: o% W7 k/ f2 J/ d

    * }9 f3 o6 Y" E朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    . _' W; i2 p  Q' x1 p2 S8 W4 z- l0 c
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    , a+ i- o! }* l( g3 ^
    8 F# m: }1 `( N
    $ J0 v8 y4 E4 \+ j' R4 z0 a3 i9 vP(c|x)是已知特征x而分类为c的后验概率。" n& v$ p2 T. j2 H

    , |$ a# K  J+ q7 K: C/ LP(c)是种类c的先验概率。- `# O+ j. T  n, g& ~$ {. i

    3 ?2 s( X0 }$ ~' U- i% p' OP(x|c)是种类c具有特征x的可能性。
    0 @, Q( K+ Z0 R& y4 L  O9 Y. u9 c. n# e/ _; ^5 e; t
    P(x)是特征x的先验概率。( u# |/ ]7 g- }& [- `7 u

    7 s  d- Z! G2 w: d# G$ J
    . B( s# j7 w3 X2 }* V6 g例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    + K9 g4 u! ^3 A" ?' k4 `2 r* O7 e* P* a
    步骤1:根据已知数据做频率表' D, l8 I8 @: o$ n4 Z( l' _& J8 Z

    3 X0 J8 R, B& X; x步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.8 k1 R. D. D, I6 a

    / j  c* R; y9 x1 {: ^5 q* i, F( }6 b" T- Z, T" Y* k, C7 @7 ]
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    / g, S+ Q+ U. ^& O' M  N+ M# p提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?' `7 {3 C9 X- a/ u; J

    . i5 y" o" Y0 f我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。* z8 M) B: v! w7 q
    ( t& W! d$ j% I5 p
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。' m0 ^& D& k7 ~( m  @
    / O8 _2 M& R* u0 y5 t9 ?5 g
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。4 H! s" z8 ?4 u. o

    % I4 H" j+ Z/ O当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    2 K1 R* q' R( S) F& S" ?% {  Z' Q' J1 k
    #Import Library
    9 T) n/ l3 [6 O: _. pfrom sklearn.naive_bayes import GaussianNB7 ]! o' a( g  o" P- a& A+ S
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      v% ]2 w/ k9 G" d* ?
    & R! y2 h, K' l. n' U$ A5 R* E0 H# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    : n2 c* _+ Z1 e" l& A; E( |* g
    ; Z; {- w" ]" g/ g7 a* E# Train the model using the training sets and check score
    1 T. r# c5 Z8 M/ T- Z7 Y+ Umodel.fit(X, y)9 ~# i) o( c2 Y

    8 j; T# ]/ u7 {& E#Predict Output
    / o7 U8 N+ J) `( V, ?predicted= model.predict(x_test)$ z2 z% I! R% _2 C* V
    6.KNN(K-邻近算法)
    0 I% [7 |' g: k/ a9 p7 F& Y2 F0 b这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    " z. `$ v, B" T0 k4 z8 \! X4 f" f% L: {* O' W2 p/ P  N: C
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。0 c, w. G+ B6 ~2 X6 l5 l

    0 [5 O+ Q: N7 {0 e8 |0 i# @4 ?3 ?/ }2 S+ t1 M& o! K2 ]

    5 l' J2 K  q$ ~8 M6 iKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。( D( f, K5 U' r( o, p& N

    : f8 k# J2 z" T# k! D2 v8 t在用KNN前你需要考虑到:
    , v  L; _# a: G: N  @3 q! O. _4 z& O& }7 x
    KNN的计算成本很高
    1 @6 g3 `2 i1 B  x% y8 l) s! R- q& _1 ^
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。. f# J. P7 G- w! Q

    - j6 Z( x: f5 J在进行KNN前预处理数据,例如去除异常值,噪音等。
    1 T" K8 ]3 B% f5 F& z4 _' z$ v" v- m" }% V( |
    #Import Library
    1 B2 n+ y7 v" _3 K1 @9 h! q0 Afrom sklearn.neighbors import KNeighborsClassifier
    $ d1 ~8 B) c+ T$ }; X. }
    ) n6 h8 ]" X+ c% r: _#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    . u4 L' S$ E& J5 e, i% W  c# Create KNeighbors classifier object model ! @" }9 L  L6 A
    7 L7 \: n" W" o  x3 p
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 51 q) h" M2 c: b' u, ^  V

    / |/ u/ J- G' F) j4 K- X# Train the model using the training sets and check score5 o2 b$ s) b" |$ j  {
    model.fit(X, y)
    % p6 |) Q+ ]( L  ]! {* f$ n$ ]/ {
    1 ^0 p# x- |: {#Predict Output
    0 j3 E5 x6 }9 d$ mpredicted= model.predict(x_test)7 a; T! S) z' t  Y
    7. K均值算法(K-Means)
    ' g; K% W* w# r+ [9 Z这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。; {! @( R- i9 t# D0 p9 |

      w# M; s5 }+ `0 [1 o还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!4 h* q$ X. ~. l5 I9 y# C8 ^2 U$ L
    " U; d; Q: Y$ Y
    ' S3 n( Q6 ?) m! F& p! H
    K均值算法如何划分集群:6 v% p5 {! P# E7 V! H8 R0 B
    / l2 [2 s" ?* n6 J9 x8 f
    9 A5 a/ P+ D1 ]9 }' {& c

    8 z" s$ t5 g" F5 x# ]. W从每个集群中选取K个数据点作为质心(centroids)。
    7 o1 I! |5 M7 `3 m; T* i# r8 E! }$ Q0 }0 H" Q: Q/ _/ M! _
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    5 A, K8 R+ I) f0 L7 b0 k+ D% j: n. l& ?
    找出新集群的质心,这样就有了新的质心。  d. Z. r' g4 R. E! ]

    3 z3 f0 c  |9 u& H重复2和3,直到结果收敛,即不再有新的质心出现。
    , S+ \- E) E( v; u0 }3 R4 z1 o% \  q# f

    ( i; {  Y+ e& i  Y6 C7 y" D" v怎样确定K的值:9 i2 I1 T3 C/ [' O- I/ q
    9 _, b0 \9 A: x3 U2 @
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    + w! j5 C/ j8 N- y! T  ?2 `
    , s! @3 V( U1 X. w4 ?7 X我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。& `/ v+ m0 B5 c: M/ N4 m, k

    + N  i8 x0 N  @$ _- W# p7 c
    8 }- {1 Z  X! g: R& W4 O/ n7 }#Import Library1 ^+ N6 R# k% l3 p1 B
    from sklearn.cluster import KMeans
    , j5 `; _; Y$ A. M4 `0 G
    & Q3 w! ]& J; @7 ~3 N9 g8 K#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset# Z/ u: K, j  f5 {
    # Create KNeighbors classifier object model
    ! b, w# F/ |2 @4 X9 `# ck_means = KMeans(n_clusters=3, random_state=0)
    ; j# s$ g; m, e5 g% _% }: f+ G0 z4 t% n
    # Train the model using the training sets and check score
    $ g- @) _% A: o& J" {( wmodel.fit(X)' i: S: q) ]' l% y- b' g* Q

    . R* j& v! q# ~( q" H7 G1 y/ V#Predict Output
    2 }6 t+ K  Y$ ~* y9 C  upredicted= model.predict(x_test)
    * [% l- o* y8 Y8.随机森林
    , y! \. U, c& E9 A& A随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    ! s1 L& t& N  m" M: I
    / z$ }5 P+ ?4 A7 T6 n3 P1 m怎样生成决策树:
    : g- C0 U: U" U3 Y% }5 I0 \8 S& |9 D( a& G1 V* e
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    ( Z$ l8 r7 z7 f# W& V
    $ C- y. U! B7 _6 L0 z5 @如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。$ w! d1 v5 O; C

    / w1 _% |5 D; L) [每个决策树都最大程度上进行分割,没有剪枝。6 ~- s. ~, L, H. w
    8 y. ?" L6 x4 v; Q( j
    #Import Library1 A! S% I: u9 l$ \3 y5 a
    from sklearn.ensemble import RandomForestClassifier
    - e" f; G4 b, M0 o: x#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset) V) Q3 D& ]% C% ^& q
    ' t+ s! K* ~5 x. E( q% P- J
    # Create Random Forest object1 ?6 t. b  Z0 D1 b7 I( T0 x
    model= RandomForestClassifier()* y- a/ O7 k- W6 M

    3 g! z, S/ h( l  u2 w# Train the model using the training sets and check score
    " Z( H$ l# s$ G; u% |model.fit(X, y)
    ! M0 S; Q9 M, s* r" W) H2 t! w0 v0 w9 i
    #Predict Output, I" r# Y* s" w3 C& B. b$ k
    predicted= model.predict(x_test), }1 C% R0 R3 ~- h
    9.降维算法(Dimensionality Reduction Algorithms)* i1 p! A2 ~3 k! G  r
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。& N# T7 P. b- M5 t- r, \, s& p: D# ?

    4 Q7 w4 P* V! w$ E. W例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    . s; K! C# v! r1 F( I
    * |7 V6 q/ L  P: }5 y9 W7 F& Q- o  a作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。% [8 U! x/ p9 ]3 b
    8 k/ h3 d4 T% [) p
    ' V9 ?. g" h+ d$ t" D1 w
    #Import Library) P/ n) R% K3 K* R( X
    from sklearn import decomposition
    3 `$ p# R$ Y' N  b+ X#Assumed you have training and test data set as train and test) g' G0 M, `& x: X
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features). u! l+ V7 n! A* t9 m; B" u
    # For Factor analysis
    9 K0 t' m7 n0 ~# Q5 a#fa= decomposition.FactorAnalysis()% ]' Z% ~; T. I7 p  `4 L
    # Reduced the dimension of training dataset using PCA
    4 P: H* [" s& q$ H+ h; m0 j: X) W5 o; o8 S5 q: }' q
    train_reduced = pca.fit_transform(train)
    # B! |; j/ I2 h0 ]: e' d7 L1 ~4 N: Q9 l0 J, L" \' t4 I
    #Reduced the dimension of test dataset
    0 L2 M, a; J4 V/ @, G7 Ktest_reduced = pca.transform(test)5 L* s. T; Z, B5 |! t( V" i$ s, @) T
    10.Gradient Boosing 和 AdaBoost! v) |7 Z" R6 S6 M+ ?6 R
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    . y4 e, X( R( {$ Z
    9 e1 ]$ u, G4 O. K2 U#Import Library5 O8 F; J% g. D6 Y  c3 I& C+ k
    from sklearn.ensemble import GradientBoostingClassifier( B6 {- ^2 b; v% e- Y
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ! \& J& w8 Y8 R# Create Gradient Boosting Classifier object9 W( |% y+ ?6 r) f8 _" D" U
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)" a" H4 b) W+ {% Z) s: G( F
    6 t# b5 u4 v9 D" Z! S
    # Train the model using the training sets and check score
    0 y1 J1 v* G$ n( v% O! Pmodel.fit(X, y)
    ) `# v4 |" }! @% G, ?#Predict Output) S; J3 X; G$ R$ I1 V. k( J
    predicted= model.predict(x_test)
    4 c# C7 x( `- C5 w' X# Y' F* UGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    1 m0 B# F$ D- s+ R
    6 @: C8 U8 Q, R原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ( L4 R" j2 P0 [" ^9 |————————————————
    4 B* ]8 |$ b" S3 a版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 G% s. O! v" ]2 B3 ^0 m9 N' {& }
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    4 k2 t9 V: `  l: O: }- O2 Q7 A. t  S. ~- U
    , z/ m. ^, u; K0 L5 K
    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-4-21 01:05 , Processed in 0.439213 second(s), 51 queries .

    回顶部