QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2185|回复: 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
    ! Z# [1 P0 \5 h2 ~/ J* S
    机器学习算法整理(内含代码)9 W1 p' _% U9 @& ~( N& K
    3 S6 A! Y  b' r% _4 ^5 a+ O
    一般来说,机器学习有三种算法:
    2 ]$ A7 `! k+ }' n' \# o( m# W' y
    + Z6 H1 u# x( G% {0 s1.监督式学习8 S8 n1 Q, f& G9 g) y

    9 B: K# J8 ^/ [/ I+ q; j 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    ! i  V5 {# F1 ?. X& G; P3 m' D9 R, N3 f0 F/ I! [. r
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    % K: c( ~- \% Y4 d6 n! m) e) Q; Y- ~3 g2 b
    2.无监督式算法
    3 X  S/ ~# M. c6 F9 m. ~
    - }0 X8 q) e; p/ z无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    - b, z2 l2 Z  R3 }. g  o
    3 K% O5 q0 z! n& N" y, y属于无监督式学习的算法有:关联规则,K-means聚类算法等
    3 l4 k0 r1 o4 [9 y! B7 M# X' B7 D; ~& }5 ]
    3.强化学习
    % S/ `' @' n$ v% M4 k2 p: n8 t! N& [( T2 i7 _
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    2 J2 F/ z; V+ L. K) \; U6 W8 N% h0 X5 c: X; r3 r4 B
    属于强化学习的算法有:马尔可夫决策过程1 m5 d: U1 }6 j  m0 S

    , f; t' b; g2 i7 |  {, I3 e- D常见的机器学习算法有:
    - \  A4 K  x- ^2 W; T2 ]
    ) T  N5 k! {. `+ }: u' I
    7 a: y! h; w' K4 `3 a8 r1.线性回归 (Linear Regression)/ x  _4 H+ U9 ]; [! `! n
    0 V; R0 ~( p* V5 q2 Z
    2.逻辑回归 (Logistic Regression)2 A( H) }* s# x' [2 E5 l$ b

    2 T: O+ q! B0 Z3.决策树 (Decision Tree)& ~/ _0 K: k# u1 M7 D% h5 Z5 u" A% [" ~
    3 v, u4 \% g1 ~+ o6 j. U) O
    4.支持向量机(SVM)$ Z  H1 Q$ n( c( E! l+ K. a9 X

    ; ^; F7 P$ G6 ?# N' f8 w& ]5.朴素贝叶斯 (Naive Bayes)7 g" g6 T' A# \7 i

    $ z6 w! a% j5 |* k7 [6.K邻近算法(KNN)! ]& u0 J+ C, G' |! A* a3 e+ F
    1 n# I  {8 V* R# \+ l( e0 t& W
    7.K-均值算法(K-means)4 t$ ^7 C) _5 f8 V; V6 f4 J
    9 w' o2 u9 L& h  G  Q
    8.随机森林 (Random Forest)
    , J7 X! G2 h- P  `$ r  o
    5 d8 b4 {# n/ I9.降低维度算法(Dimensionality Reduction Algorithms)
    3 D" ]/ Z" P8 [/ ^* S1 H0 v  v& X4 s( p( a4 L9 r' U0 t- K6 s! p# G
    10.Gradient Boost和Adaboost算法8 h. {' {% S/ S  K. \
    一个一个来说:, C! |& G0 x& O% R
    1.线性回归
    # v) F' e6 B/ y8 H. Z3 ~8 _+ Z6 Z& D" n' D
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    . @: _; x* K* P: I) e
    & w* ?" k' P$ B7 C在这个Y=ax+b这个公式里:& d# u" D( {3 i, u

    / r& V/ y2 z8 K" z6 q+ s Y=因变量
    ' {, ~& y! `- }( V4 x- l' w: j$ g  z# l3 [- y, g& O0 d
    a =斜率% b3 z* g1 \. C; C; j
    3 T& Y) h# r+ L/ E; B# _
    x=自变量
    ( g& h  m6 j$ A) d) r" n/ n
    ' S3 x: [& i; R b=截距- H( J! ?; M8 E% E% C; l. V4 s6 S
    4 c+ g. A! Y4 h. ]; u
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    4 J6 B( X9 d$ t. S+ ^& _" A1 f  J' j& R% H+ b
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。0 q: a% A2 s0 m

    : B6 @) G& @$ r- J0 I给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.7 K3 V4 f8 Q# y% F7 H

    - @( c1 O. C, E+ K2 Z1 y
    ! t4 ?/ ?& O( ^8 ?
    + K- W6 y% b  x0 l7 k- w0 ?线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    : s1 r6 G; a$ P7 ^. v$ M7 q* f  a# e( I) x; J
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归. a3 ?3 g1 ]/ A
    5 i# X5 X/ h, g4 b' ?' Q3 G! o
    Import Library  {7 N) A- j5 {/ D! V7 W
    from sklearn import linear_model
    * f- G3 o' {6 T+ a5 ]+ Y7 n% [$ X; k6 J" m! P/ o, \3 E/ U7 }) M
    x_train=input_variables_values_training_datasets
    % M' w) u: r. Ky_train=target_variables_values_training_datasets: r: E7 N) H  c3 q! a
    x_test=input_variables_values_test_datasets/ G' c$ f% ?) M2 L% e# v- Z. y" F
    . L$ [3 b( n6 ~, s1 \. ^* v
    # Create linear regression object
    5 i; Z- n/ F( F$ dlinear = linear_model.LinearRegression()$ P7 _, ?. B1 _0 K3 N
    8 c5 c% H9 W+ u, \: t; T
    # Train the model using the training sets and check score& p8 x9 B- ?. e/ Y$ s
    linear.fit(x_train, y_train)
    5 R& N0 g5 @, X" y1 r! }linear.score(x_train, y_train)& Q3 K+ D  J9 w% y" O) B! @. O+ ~
    4 i2 s. A# f! L9 H$ T
    #Equation coefficient and Intercept
    7 c/ O- d, v# Sprint('Coefficient: \n', linear.coef_)
    9 [. Y9 I8 t) Qprint('Intercept: \n', linear.intercept_)
    / u. i2 M- u+ _" W- d1 T! J& w  N4 g3 ~. t6 U( j/ f1 o
    #Predict Output
    ; N4 X& ?7 Z7 v9 M7 opredicted= linear.predict(x_test)5 O  _" c8 t" ]% A% t
    2.逻辑回归1 h2 G6 u' e% O6 j4 A/ O( |: r
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    6 W# j5 `% H5 z7 u+ @! |  n' ]
    ( W% C/ _2 P, Z0 H1 J同样用例子来理解:: _. S% f5 ?2 e% o" L( E& F

      \) V+ T' }# W( {( e6 {0 i假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。. I" O! E* Z3 Q

    8 e! ?- d: k% _0 @: C数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    3 Q& P3 |) n" b( x1 _0 v, @5 f5 [0 y: p
    最终事件的预测变量的线性组合就是:
    - m# v2 p- p9 B$ E) {5 F+ c7 @9 j6 X
    3 k+ f7 ?$ E0 Q7 q. |8 }
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    1 D* V" c/ t( A- U. T& O& t7 f; o) R
    ln(odds) = ln(p/(1-p))
    ; h2 {/ h# L6 P5 }9 a6 C4 j" s! M! F* A& _2 B! [
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk3 f! }8 y  J, |) N; C, u+ m
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.% b. s5 U- h7 v5 |3 N

    / q# l; ~" z" H/ D至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.) h+ ]$ f, O* X2 c3 E' x

    5 x+ U$ a! W- e, ]+ s: h' f
    . G4 t/ z3 S2 p3 x" T! ~, L
    8 T5 \3 e) I3 i+ J7 F from sklearn.linear_model import LogisticRegression! C. m. c: g6 Y9 a8 E6 l

    9 c8 R) T1 ^1 E4 W7 |  ^, O$ g model = LogisticRegression()) }- p3 e: T: f7 {" I

    3 ~9 f7 {& k" W7 r. { # Train the model using the training sets and check score
    " W' ?# v4 K2 r5 K2 d9 g1 } model.fit(X, y)- B* v0 }# t# o- O
    model.score(X, y)
    3 y, U4 z8 N+ S" S5 p& d7 @. Y% J, P0 z7 C1 A2 w" s
    #Equation coefficient and Intercept
    # |( r! ?& x9 H& \0 Q7 |9 k4 N print('Coefficient: \n', model.coef_)
    ; D6 Z' E6 }5 s3 z( E print('Intercept: \n', model.intercept_), W; N2 p6 e6 t- {( j

    $ o4 S& f! E  u1 v3 j# C #Predict Output( g. {2 P  g- W
    predicted= model.predict(x_test)0 ^$ }' p( o  _
    逻辑回归的优化:
    : v, r/ r2 {- b! N' @- O4 ~加入交互项
    6 z: d) n  T- v3 j, ^, R: ^1 Y& }- k# P3 x9 Z  O
      减少特征变量% n8 o% |; G# F2 F( h$ P

    0 U/ o7 g$ {/ A6 w" a8 N  正则化6 W8 g2 F" I1 S$ w. i  K

    0 w; V0 y+ U+ y& o- h) v  使用非线性模型
    8 F$ L& }0 O" U, R6 s4 h. q4 `. I! ^3 x4 f5 X1 \/ l% T( L
    3.决策树
    + b7 e% A6 w' ]: a/ G这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    , d- @9 S; z0 k2 ?# R" z3 e5 G/ w/ r
    2 ^/ U$ ^+ [; g" v* E, v/ ^  _2 u2 M" _/ @/ y
    : s& D9 o) \- B# S& ~1 _
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。8 o& a. w. O* j) m
    & B- o% \5 T, G  e

    ! @0 |! |9 Z. l  Jfrom sklearn import tree
      X% I, K0 r( e& y- c: P
    * n& ]' I# r2 N+ `$ B( ^
    4 G/ K, K+ T" \9 z- p# Create tree object
      g8 A/ L: q8 tmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    . n6 K; K6 P3 b+ w, R9 W% E* M4 P7 ]% ~% B( p
    # model = tree.DecisionTreeRegressor() for regression& O+ b( i, T$ K) P2 ~
    % W+ e% ?) u  ~$ R5 M
    # Train the model using the training sets and check score
    1 k% C% ^1 P! B" \* f1 D: O) Dmodel.fit(X, y)
    1 W( e9 _- E$ ~, _model.score(X, y)
    0 ~* ]3 P! e; Q3 m/ ~! N. X% U
    ; _: _6 z5 V' }# }+ [0 @#Predict Output$ G$ o9 S' K) }. s, R- b
    predicted= model.predict(x_test)
    + D+ a0 S$ j. j4. 支持向量机(SVM)3 w7 _2 Z' J1 |4 ^- k
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    % \) G4 F& X+ z" g# @& \
    / y9 `% t6 T. Z/ i2 B: G现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    ; \% n# `1 b# ]: S8 y5 F7 y" W: @+ y9 ]1 x2 `9 {; n
    % Z! V" L! ]- g- o8 _4 l4 ~" t5 M
    & G  j: T3 A: j
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    $ g: g6 d" f- M
    1 h9 H0 ^+ w0 O% `' R8 n' {#Import Library  `" J- b0 u! ^. C! n5 h: l& ~! s
    from sklearn import svm
    0 {8 Q& u) c. Z+ D0 t: j% h#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset1 E/ i! M- z* d8 m8 d! V: v) H
    # Create SVM classification object 5 W# o/ N, Y# ^- S
    3 a7 V6 {9 \& J' ^* h& {: w
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.* X( C! e8 c% T/ H3 S* U% _# |* w

    - l) V: ^" a/ Y& S1 [' V# Train the model using the training sets and check score
    # W6 H2 H4 d& u( |# j$ ]7 X. gmodel.fit(X, y)( X$ m/ c) ^9 U
    model.score(X, y)' w# |$ a" h! W1 @: t

    . v/ B0 w" A' U/ n  ^8 O#Predict Output
    ( Q7 a$ B$ r5 S% h  e/ u) p5 ~3 @predicted= model.predict(x_test)- h0 K; C4 e5 A5 O; d) ?
    5. 朴素贝叶斯! E- j. R6 Q1 [# w2 I
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    % C; ]6 I( L6 H+ M
    7 x9 ~4 y2 d  H% D7 o朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。" U. Z/ X" p* U; u
    & h* T0 {8 {* l3 G
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:& X4 o6 a: Z" p+ \) d: |) t8 Q) ~
    7 Z1 @7 {, U$ X# z; O1 `
    : D9 A3 j" v$ k* N
    P(c|x)是已知特征x而分类为c的后验概率。
    0 T. @( R9 h& c1 d( o/ H! |3 b3 g
    : A3 e0 t0 P+ P/ gP(c)是种类c的先验概率。  Z( A# L( X, Q9 J
    & f' d; D/ i0 ]1 U9 _
    P(x|c)是种类c具有特征x的可能性。/ ?/ I) L/ S0 |5 e! `0 B

    . m7 a/ w" B7 R7 k; S7 JP(x)是特征x的先验概率。
    ( _0 h+ k  g, G3 H% _. E: D7 Y1 N9 i' J: V4 U; a! ]' q  x6 z
    # v$ a  D+ N: y
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:; O& U5 ?3 m9 P: g" r

    0 H3 b; N4 `* Y6 U步骤1:根据已知数据做频率表
    + W9 Q3 V: Q5 {3 f# u
    ' A+ p) v2 G' a. r) V步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    - e4 {' d6 W1 x0 _% r1 v! [8 E/ f& G

    7 `4 x# ]$ P# g8 {% g5 e3 q  z步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。3 M- }5 P8 s: {& L, q9 C: k
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    $ I+ d: ~/ R  S4 C* X) N$ X  s9 H& f1 s, E. z& i8 \
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    ) {9 x) Q5 {' y1 O* J5 L+ |8 m6 y9 f1 p( M4 p+ Q
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。" N2 ?) H9 H0 G9 H
    9 \2 m- q. }6 o# R" L1 d) S
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    6 R. U3 a2 b9 [) [  S, _* T) e" T" @- e, }+ s# i* `
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    5 L1 ~$ }6 r& ?& J# ?' B1 J: ?2 [& `8 l. m) C
    #Import Library
    ; w3 u, U9 k2 m) Xfrom sklearn.naive_bayes import GaussianNB9 B: W; L. A; i5 n& j! P" Y1 W
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : }8 x9 \2 o4 A1 r, q
    . [8 t% P8 Z9 G! X7 S# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link; v/ x/ [8 y6 A$ k" R
    ' O' n7 x* n3 P' [: r/ p
    # Train the model using the training sets and check score
    6 Y  c2 Y% y( M* B( N- _$ ~2 |model.fit(X, y)$ x* D, _' P. J$ H# x  d! j
    3 W  A. E! R$ ~& o7 `7 }: [
    #Predict Output5 K6 M( J+ ~* [/ ?- |, @9 [' T! i* c
    predicted= model.predict(x_test)' w9 ?/ W0 `8 B1 C+ R: x: e/ h
    6.KNN(K-邻近算法)5 b( c: K( ~0 d2 T6 Y- C7 U
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。$ C/ R: {) ?  L

    / R+ S1 N& Y" ]/ V* ]距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    ' ~! f8 t+ a3 O" K9 Q7 e) U" ?1 Y- L- k. k& f* e- q0 }

    ; `$ `( J4 C$ _
    & B3 k7 h- d& c: x. ZKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    5 ]& C8 w( D( \7 L) _
    / M% E$ a4 Y. K; b( t3 K- m在用KNN前你需要考虑到:* e9 t1 r+ F) p/ z, s$ x7 C& H# s6 C! _
    2 d1 i- G# b. x3 a9 \% s
    KNN的计算成本很高! ~, d" {  ~6 u) r9 Z
    ; m, S/ a5 _  F) L& Y
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    , i' L/ j& l0 @& M* n5 m4 w8 v' g" u4 [
    在进行KNN前预处理数据,例如去除异常值,噪音等。$ K* z% o. b& N6 `6 v" E, B

    7 i% X# V/ p4 `4 G" }* c1 u/ }#Import Library4 b  v8 W  N! t& L$ j0 `
    from sklearn.neighbors import KNeighborsClassifier/ P, D" d0 M* }0 I1 L" T* B; h
    # {) W7 d; F$ e; y9 u; n3 Z
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    * A5 E+ F  }$ ]; U6 i' w. u# Create KNeighbors classifier object model
    7 \" l$ F5 U5 W7 n4 v" L) d6 s6 l0 C( {7 t
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    % [: H5 o# Z4 ~, w" I6 R
    5 j; Q' t4 |* C: s* y# ]# Train the model using the training sets and check score* @' g6 w9 t( m5 a
    model.fit(X, y)- I" z- j* n0 S

    8 x  V1 _7 V& ~4 \#Predict Output
    0 R/ j; v5 g  l. _predicted= model.predict(x_test)
    / n# ^# w! j& x7 u, a- a1 x7. K均值算法(K-Means)% H* A8 _' a7 z, F1 g
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。( R& H' Y9 k8 N- e+ Q

    ' R: z/ o7 v. a9 W. K' U还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    7 x( l5 i. f+ u( H5 U, E# [+ ~- m
    2 T, `% v/ E" G% v5 ]- d( T
    2 A$ ?/ z8 b- G# j5 w( Y9 iK均值算法如何划分集群:
    0 I! T' k7 W. ]' A9 A: B! M& m( f8 f7 N2 E- |) x
    ; F% `+ ^5 f( p6 X1 |+ c2 `- d
    3 U2 d( [2 Q* B6 o6 w
    从每个集群中选取K个数据点作为质心(centroids)。
    5 _& ~* T5 ~: f0 c% s$ j* B5 m; j; y8 O
    , x3 D* S8 k4 s4 G/ l5 P将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。* p* n1 ~/ E) @4 y4 D5 a
    3 C) B6 Z% ~3 W
    找出新集群的质心,这样就有了新的质心。0 ~! y* |; Y) Q  s$ e

    % v6 m) c* Y- {" r9 A9 J- [重复2和3,直到结果收敛,即不再有新的质心出现。
    : B' C1 N/ J3 i, U. a* Z4 j
    5 T' d3 W6 V5 ]. \5 V+ Y3 J0 j8 Y% h8 W
    怎样确定K的值:/ H) `+ V' j. [$ e) U
    1 @" V5 Y, T$ N3 b6 X' A
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    / K; f% Q' {. h4 p0 |, v" t0 N2 g4 }$ Q. q/ ?$ v4 |
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    ( V! ~$ D: \! D% u% j' m) }2 _: R; }' d$ S5 @0 {- L

    7 O) s( n( x& @: L6 e8 N# i#Import Library) w# N- w& o9 c2 Z* q$ u* S* C
    from sklearn.cluster import KMeans
    ! L* Z0 \9 F( l
    2 N( `! ^( E% j( i#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    4 n# t5 v' K; s+ H- e+ @# Create KNeighbors classifier object model - @% h! {' d5 z( o8 _5 D9 d5 s( h
    k_means = KMeans(n_clusters=3, random_state=0)
    & ^  V( ^7 W$ f$ [
    & J- r& j: l3 k5 n" x# Train the model using the training sets and check score5 R9 F% q  r$ P  t9 n
    model.fit(X)
    & r# h$ U: f% G: a' w4 h8 v5 ^1 \4 ?
    #Predict Output7 x8 f/ y1 ^7 {6 j7 w& L; G, @
    predicted= model.predict(x_test)
    / ^  c5 t: j; ]8.随机森林
    * u' v+ X/ q0 A随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。/ E8 R: R4 T# A1 f7 }2 `
    / o% h* y/ L5 X
    怎样生成决策树:
      T6 b& ~- q, c4 h8 R( C! ~
    % L. X4 @5 R( m! ^7 w( p/ Y) U如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。4 P0 W$ j# ^0 Y
    - j5 H- F9 V$ g! ?& q3 }; f, U3 @
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    1 v: m, }" F. A1 Q: i& `! T6 C2 H
    每个决策树都最大程度上进行分割,没有剪枝。$ y$ R; {6 e2 E/ f0 {! L
    ! q8 @- o& `( e; _
    #Import Library
    ) C5 n0 ~& D% _: y  r" e4 M1 o; r3 Ofrom sklearn.ensemble import RandomForestClassifier; X' R  O: v' V, }% G+ O$ B
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset- G  i+ j" _9 X$ ?- k! n& V

    - o6 r, @2 b$ p' @4 o  t6 o# Create Random Forest object
    0 T9 n6 p, y# J: m( K9 X/ gmodel= RandomForestClassifier()+ q; u8 t, U& c
    . Q* A4 t5 N& i6 T4 E
    # Train the model using the training sets and check score0 b, @9 P$ |) X0 h* |- n
    model.fit(X, y)
    % e1 S9 j7 G/ ]/ i8 W' g6 i( D; \2 L6 I7 L
    #Predict Output. ^4 b; e; l/ s# p6 p8 P
    predicted= model.predict(x_test)
    5 o1 s( |6 j9 Y! {9.降维算法(Dimensionality Reduction Algorithms)
    : f- F" x2 g+ G: f0 n* x7 b; X0 q在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
    + Y* s" V0 r; b2 d3 z6 k) i* ?" `
    5 q* F  Y7 a9 Z/ P, f) D例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    4 S8 x  C8 z# j
    3 P9 F+ c: M+ F6 q5 ~, J( Q作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    ( V' G) s! l8 e6 g
    ' ^: T$ W$ r, c7 o$ N# Q& {  m4 X6 x/ o6 Q4 B% s
    #Import Library# m( Z' u' l1 @3 W
    from sklearn import decomposition
    - b/ @4 F+ F. [, W+ X" V4 t3 X" O#Assumed you have training and test data set as train and test4 V9 }2 B9 W% w1 L5 b; C8 C
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    + B8 r6 ~9 K( k0 u3 j# For Factor analysis$ M) w3 \: Q5 o" O2 e) ^; w' I7 t1 Q
    #fa= decomposition.FactorAnalysis()
    6 k+ |- L5 F" Y3 \; }6 q1 ?# Reduced the dimension of training dataset using PCA. Y6 e  y3 |1 X# q

    5 |" U2 r9 t" l1 xtrain_reduced = pca.fit_transform(train)# |1 m* y4 m$ D0 i* N* m

    ! `( E. d3 o3 M" u' H#Reduced the dimension of test dataset
    7 o1 M2 J, r5 X- f; Q) gtest_reduced = pca.transform(test)( l& _. c  }+ _* [( y0 I  o  E
    10.Gradient Boosing 和 AdaBoost) B0 O8 s9 z( q3 S/ \: u
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    * i3 j! C( I5 Z7 D' x  z3 u2 L
    ) s8 F. J: j8 Z) P#Import Library
    + a; r$ T( ]5 B5 g) Mfrom sklearn.ensemble import GradientBoostingClassifier
    - p# m$ h1 X: l#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 S0 X$ q: o' z
    # Create Gradient Boosting Classifier object) f0 {* g! k/ ?8 @' ?# f- p# \7 T
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    : D$ u' u  a, O2 F4 D
    ' s/ t; f! Y2 I& g. h) {- f& e# q# Train the model using the training sets and check score
    ' J- d" D! a7 p9 V! [8 pmodel.fit(X, y): r/ W- u5 e/ J1 D9 a$ b& {
    #Predict Output2 K/ r# M7 F' _; D8 \- j
    predicted= model.predict(x_test)7 t2 o. y; x$ x6 d1 {& ^9 o  I6 d
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。2 e- U  ~# b9 c! j& e3 [

    4 K6 G# M2 K6 `. h, `8 o原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ) x+ K% q0 y3 m) h————————————————/ ]/ i; p2 f2 z' B
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( H# Y6 M3 X7 I# |
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    ; R$ y$ C+ f+ t! \+ G4 j
    : @% a, ?$ ?/ U- S; x0 R- j0 Q+ n( m7 M- N8 ]
    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-19 21:11 , Processed in 0.289667 second(s), 51 queries .

    回顶部