QQ登录

只需要一步,快速开始

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

    " S$ j2 V6 p  n) W! }. ^: H机器学习算法整理(内含代码)# X& y. T( {, u5 S1 N

    / o2 H9 ^: R* x6 }( z/ `; I一般来说,机器学习有三种算法:
    0 ?* F+ ?- D; h7 Z- H" D( n+ }
    + G& f' f! T' W3 o3 d1.监督式学习
    8 k2 d2 q1 P! j# k# z. d3 t4 d/ t% P1 q  }! p; {
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    7 q4 Q7 y# w, c/ E
      @- m( w6 Y: _' \# U属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法; I+ q" S% \) i1 @

    + a/ n; ?8 K# z$ t2 O; G1 G* w2.无监督式算法' Z% i( T5 E& H1 {8 b' ^" G' v

    ; j3 X! D. Z$ x1 x2 a/ `无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用." c: F6 O$ D% D! V' m

    ! N* V# Y( c4 s+ O3 j+ ~2 S! q属于无监督式学习的算法有:关联规则,K-means聚类算法等" P/ y1 V9 v  j

    8 M$ ^3 [2 w' Y: G, J. a3 k7 h3.强化学习
    * J+ @& ?2 \% G. ?
    & M% W* E" y7 ^* {# x! Y这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定( ]' c" t: g/ S: I& E
    6 _- [9 }* S1 o
    属于强化学习的算法有:马尔可夫决策过程
    # f. `9 G% a2 {, G7 t9 i1 I# \$ f! a0 W- B6 S1 [! \
    常见的机器学习算法有:
    % H/ ~5 Q- v  }! [. v
    / x# K6 @7 q+ I- B2 ^, o3 `, S! H( X( A3 p& k9 U
    1.线性回归 (Linear Regression). B5 L3 F8 t1 L$ t

    0 y0 X2 C: j' y& c2.逻辑回归 (Logistic Regression)
    . |8 A# D' j: |9 z- A* Z
    " ?+ _5 F- w" U; z  s+ [3.决策树 (Decision Tree)3 @3 s( D' S$ f+ A

    - ^9 {3 T$ Y! m7 X; }" n  c% O- {! E4.支持向量机(SVM)* b' ^5 B) h) Y$ x7 q4 I5 K7 I

    2 d7 `' R4 m. J; Q9 W3 w5.朴素贝叶斯 (Naive Bayes)) p' |% Y7 F1 }
    # {3 L% \1 d9 q' B: F3 m0 k6 g
    6.K邻近算法(KNN)
    ' j2 v! J/ _3 q/ \& b9 E( z: H2 e6 ?1 [( g: n% J7 f9 c: V, {
    7.K-均值算法(K-means)9 K9 D- r! J2 b0 B% Q

      Y4 Y; q  n1 D, y8.随机森林 (Random Forest)
    ' W- ]+ H% l, k# q# W9 n. b
    9 b) @1 {. [' M& d/ r  ^/ V1 i9.降低维度算法(Dimensionality Reduction Algorithms)
    2 n/ I& n2 r, F2 {7 _
      @5 {4 a$ b2 [7 J10.Gradient Boost和Adaboost算法: B! H" R: |7 v! k. m/ l6 R0 ?9 @
    一个一个来说:
    4 b" }& h  H1 Z8 N1.线性回归
    4 o8 K! g1 I& _3 J6 w! m
    , _& \2 Q6 P8 \6 }% S线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
      y2 f! ~  Y% V9 S8 W/ e# j" J  t6 Z/ [. S% Q
    在这个Y=ax+b这个公式里:
    ' v2 `6 q' R+ C( {0 W/ K2 E2 A9 Y( I+ K4 k0 C. h! A8 s$ f
    Y=因变量
    , v8 A7 t5 v- Q" `3 a
    9 @4 ~7 v% E1 _% K a =斜率
    # S. Z/ z% H% H) r9 y
    # N9 |2 i: V/ k5 s% x. m% } x=自变量
    ) `) Z& q& w+ {
    ' f1 q8 ]* s4 J b=截距
    3 r, L3 |8 W6 ?! [! n2 w* ?# r; c1 T/ x5 z3 T
    a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    - [) U* L0 E; t& H
    # G% S+ J: `8 \# L我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
    + J' y$ |: ~% d  H# Z& s- Z. n9 K6 \. [: I% ^
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.0 a/ v  c: f- T4 s2 v( [! q9 l6 r
    5 A* M, a1 Z2 U9 S
    7 o/ e: y$ i# t$ X
    ' @& w( b6 S) p
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.* v- p. p5 x  O( [$ l1 X
    9 _/ q* [) }" f+ t$ k
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    / I+ B9 r! |; N
    0 F* q: J/ I6 y9 Y; H" Y3 AImport Library' S' Z' b. w* m
    from sklearn import linear_model
    2 _# {9 c+ T; s+ R, [5 P/ k% Q# L4 Q" `# Z; V% U
    x_train=input_variables_values_training_datasets8 t) G9 S9 \: _* K
    y_train=target_variables_values_training_datasets
    & ^5 @" m) w: k6 \6 tx_test=input_variables_values_test_datasets0 t7 G0 v8 F/ o! j

    8 ^7 V, O% M# H8 O) N# Create linear regression object$ h; E6 U7 k( N; t: n7 P1 M+ W
    linear = linear_model.LinearRegression()
    : J# |6 G' Z  G2 T4 D4 J& l* w( \- t
    # Train the model using the training sets and check score( g2 U( Q' q3 G9 z7 _$ g
    linear.fit(x_train, y_train)
    7 O/ p1 f9 b. ~. _! o# p) klinear.score(x_train, y_train)
    % a- y$ D# B, [
    ' W' L% h  q$ [9 N  n3 O#Equation coefficient and Intercept8 u- m+ ^6 p4 F7 j$ q) A: |, n
    print('Coefficient: \n', linear.coef_)
    6 H* g' k5 |0 I( r8 Iprint('Intercept: \n', linear.intercept_)  D2 M4 o  j+ I4 p2 ]3 W

    # S, v% e2 ?) S$ y  ^8 {1 ^/ i: k* P$ D#Predict Output- _. _! S; [( \: h1 j! g* R9 v( g
    predicted= linear.predict(x_test)
    5 F9 Q: e% W( x  T2.逻辑回归
    - _3 ]+ d9 Y5 N4 ]! I% N+ h3 ]逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!/ J. x; u/ n" V% H0 r

    4 [( ?9 Y7 e! B  B9 C同样用例子来理解:$ m5 V/ Q6 v' A0 q" C2 N

    0 F) }+ Q0 j1 B2 X2 F% S; a假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    & M  l1 X9 C$ A, i" u+ B" _7 q& a8 b# A. D3 F/ R2 C4 e4 R' G
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧0 {( S! D3 s! W7 r1 D, i; V
    5 n: X' K0 p, G0 r$ S/ `
    最终事件的预测变量的线性组合就是:
    % y; @# @0 [% f/ m/ B& N& u) |8 m- D: d; q1 ^  ?3 W# ~5 F4 G

    2 |, r+ z% p; ~+ S7 s, @! V& J% s! ~odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
    8 ~' h6 Q% \, C3 Y/ ?( C0 {
    : ~/ J% \6 |- ^8 S% Q1 a' _' cln(odds) = ln(p/(1-p))$ c' m8 R, ?3 F, C0 l# \
    ! N7 N' W2 r3 W; Q
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk- x# g- [- ^8 T) M
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.7 z4 A+ d/ m3 @
    : ^5 Y; ^  e7 I% n( A7 R
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    ) O" H, t- P+ Z9 d% m: n
    * h, m; |% ]* l/ u" O* |; u6 o7 F) `6 d* G

      M% v% W5 x8 _( a from sklearn.linear_model import LogisticRegression
    1 k" F& X* v7 V6 X. p
    8 U3 M) r1 e/ w& a model = LogisticRegression()
    ' _. E( g) x: `. ~  F, s5 R6 t7 M+ I& x8 ^7 m
    # Train the model using the training sets and check score: [8 W1 n/ U& P$ G6 v
    model.fit(X, y)
    5 X5 f, f: m9 Y- ?* w+ E model.score(X, y)
    3 |) `7 `0 X3 u/ ~% @3 H, |; H( ?/ x) _5 a4 H
    #Equation coefficient and Intercept
    , ]$ {& l8 k1 U" l, ~ print('Coefficient: \n', model.coef_)
    8 z6 t% {3 Z, n( C print('Intercept: \n', model.intercept_); s+ {( W9 {1 a5 T, I, A, T% p5 N% `9 B# B
    9 b7 A4 B8 c. y
    #Predict Output
    , u0 U/ T6 ]% S" C predicted= model.predict(x_test)' @% x7 `4 o3 J/ }8 V1 W$ Y( k3 G+ Z' ^
    逻辑回归的优化:6 l0 @3 ~4 \- n# ~4 {5 a* S
    加入交互项$ `1 `9 H7 }  c) x4 d+ r( F. l# g
    ! X% s1 ~4 ~% c: ?+ `! R' j- x
      减少特征变量( J* F4 }* m: ^" i4 Y
    2 h9 e' v9 M8 Q# c4 I5 N; l
      正则化5 H, r& _6 E4 H% u8 q+ Q0 I% w

    7 b1 V1 P, b/ b  使用非线性模型
    1 ~7 g% N: W! t+ o5 l+ n- `# b- b. Y* E* ]1 B. I
    3.决策树
    . G- S& [  F+ J& n+ j8 Y这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    6 @/ i# I: _" y& E; D! E) i* _
    % g- h8 k8 ?' [6 e. f, \8 E# U: G3 W3 d, d- P

    ) y! m: R- @" o3 D) i从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。$ f4 q7 C8 C3 ~0 G, [
    2 `6 s$ |" F0 y/ S* W

    1 k: B4 f  W& u7 S& K+ zfrom sklearn import tree
    , ?$ [0 m) c8 R  f: z, s) ]
    5 h& ]* \+ ^/ G+ s2 J, E8 s3 X7 C* D+ l# e
    # Create tree object ) S: B3 O. c) }2 z7 D( G
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  . t9 o; r: n. L7 c) M

    ( _5 i+ @9 ?5 Y: Z% v# model = tree.DecisionTreeRegressor() for regression  v% n  j2 Y% c, J4 Y4 R- h. o
    * \( h2 u, G# I% p$ {. i  \
    # Train the model using the training sets and check score
    3 y! I8 r3 ~0 p3 H; L4 q- ^model.fit(X, y)+ Z+ ~" L( F( H1 y
    model.score(X, y), b  o! x. ~! R, x) j% [
    7 Q3 s6 E8 }" K2 j$ I6 T5 l
    #Predict Output* f5 K) N, d$ `4 w
    predicted= model.predict(x_test)
    . @: S# K8 a  g" n+ X- j7 y3 a4. 支持向量机(SVM)9 B) [6 q  i, {, ]
    这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。6 ?8 E& s( Q8 V+ m
    ' x# _8 w3 J0 h1 \8 a
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    $ U  l: J1 K8 Y
    , g7 R; H$ D. s1 B% m2 ]* E7 _+ B
    / R" j, \2 d. {- s" F$ F$ j2 w" o% b2 I3 g4 B6 N' R& y
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。7 n3 C9 t- g5 k' Q2 ^) l2 {
    * n* l2 T( O. X
    #Import Library0 `; C. j7 Y# O' r+ v9 R8 u
    from sklearn import svm
    4 |" D( v5 o/ b0 d' K! C#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    / Y' z: F, t/ R3 G# Create SVM classification object 4 d9 C8 i) n/ R3 {& \5 s

    . q- H" R( |7 z) k- d% @model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    - z6 S' C, J; F3 U" W( Q2 t$ c. U0 r0 s  R8 v1 v7 j
    # Train the model using the training sets and check score
    : i6 _/ O+ C; E5 Dmodel.fit(X, y)
    / }1 K  a: s7 ~9 e4 ^, U( u; tmodel.score(X, y)
    4 ^- o  J9 {- k1 X/ ~! R% O8 {% G
    #Predict Output
    " f* p# H+ f6 J5 g; y7 B; {6 s$ R& Qpredicted= model.predict(x_test)( O3 v# A2 c1 `
    5. 朴素贝叶斯3 C1 Q; P( G7 M+ t" N0 O
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。" T- H3 \0 t' w) _9 t
    $ G5 C0 p" Q" n" _& Z
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    * o" }: }) F7 i  N+ k
    * P% Q$ a3 ~/ k7 P! p贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    % N: j1 ]6 U/ I' F6 e5 }8 B& Z! z* ?6 }. @/ r+ R& ^7 d8 |7 b* H5 L. [
    # a. N$ J) Z; \' E; O% V" m; n- w
    P(c|x)是已知特征x而分类为c的后验概率。' Q) R/ u% R0 n& P4 ?

    * B. L  F, D0 Z, u# h) bP(c)是种类c的先验概率。. N( R3 Q, Q* B! N) |' y3 z% }) \: B8 [
    6 M8 y9 _/ n# r! B  h1 |
    P(x|c)是种类c具有特征x的可能性。; l6 m7 V; C. g5 H  h0 Y3 S

    % b1 I2 k. p  nP(x)是特征x的先验概率。, {) D. [$ i( w) h9 F3 E5 X6 X3 X& `

    ( s: S% @* a- ]$ m/ z0 ^& W. V: q2 H0 \* P) ^9 \3 {' K
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    5 X9 @# D' g. W( G1 p7 h/ f1 W! w, c4 W+ Y
    步骤1:根据已知数据做频率表
    ( ~0 E1 W0 K0 N! f( Y- X% O+ e* F  e% I5 o
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.2 G+ z3 K3 \# R5 G% @
    0 x( E% i" `" O6 A8 b. P, f1 }

    & z/ @% o! J  I7 o. v& P步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。* ]+ Z4 I; j& C7 D
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?) W# s. ]. g8 e
    6 |9 ], f, i5 k
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。5 D' F  T3 k7 s, e- n. F
    . H6 y: C/ g0 ?8 W" Q. T
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    . q+ W6 W( C. n8 h  \* h" v' m8 U
    % T* h1 r" Q1 V  P那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    6 ?# [7 e" C. \: C& m, k1 `# ]  X4 I8 [% ^
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。; E; X; b, b. z, ^% O$ l
    - ?7 F" L$ t. M
    #Import Library
    6 i2 H0 V# D6 ]* y6 e2 Wfrom sklearn.naive_bayes import GaussianNB
    . X; x8 J3 E  L3 k( x#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset6 g, R1 ]( E" S  L
    5 c( f7 G5 `; x
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link; i0 @8 o3 n0 _7 Q, k% i8 J3 }
    5 ^4 ~5 ]4 z5 i
    # Train the model using the training sets and check score, G2 W8 x* d' Y! p( K) R9 U8 X
    model.fit(X, y)' r. o2 T  d# k' f& J

    1 Q+ J- J8 k4 x$ X#Predict Output  ]* ^' L2 G+ q) @  V
    predicted= model.predict(x_test)
    # m! T2 F, J' A& d6.KNN(K-邻近算法): Z% S/ O+ U: d  S! e! ~' q+ D
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    6 g! k) H- d5 t# ?# B! Q. J
    1 K/ m/ R; d1 c! {. j% F距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。5 s& p5 K6 j/ B4 `- S

    % q4 c. g$ Z1 V6 p8 H% c' ?5 ^
    ; W' C% G8 Y+ g4 Z6 j  `; n  \: k. [, F  @3 H+ n3 v, K$ [# y- a
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。- j0 o1 x9 `4 ^; O4 @. i7 k

    ( v9 F6 E+ _9 [! q+ A/ y% ?在用KNN前你需要考虑到:7 D/ F* z- M. U4 E  o! [% [

    , b5 B+ u! ]0 F0 iKNN的计算成本很高  F5 R0 w! j4 Z! y1 r9 S7 K: _. }+ x

    / R# e" ^) O$ X! x/ c; x所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    * L) L# O0 c4 ]0 H. ^
    0 e5 E$ O$ h1 z$ S" w7 }在进行KNN前预处理数据,例如去除异常值,噪音等。
    4 K; o8 ^4 G4 k% K) h7 M4 W6 r# @) x( \- i( p& k! u$ b3 @
    #Import Library+ U$ L3 y+ g8 w. z7 {
    from sklearn.neighbors import KNeighborsClassifier
    ! z# |0 k+ y# L9 K
    6 t* W  l# A0 t; N/ v( Z, ]3 k' z$ B#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset3 h+ {  C/ F" [$ I
    # Create KNeighbors classifier object model
    1 }, \) U9 t0 V& [3 g1 ~7 W1 o6 Q! ?+ X# {: Y
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5" x/ K" B: ^% R" D0 H% d' a, L

    4 [" K& W0 @! M' x3 K7 y, s# Train the model using the training sets and check score5 w3 l6 O8 Z3 N$ e) `& t
    model.fit(X, y)- D7 X. B9 P' r; ]! k  z3 [
    / j7 U' ~- O0 W& _
    #Predict Output6 S; k- ]' N: f# S9 [- W
    predicted= model.predict(x_test)
    6 |) G/ o  S: k+ e+ [7. K均值算法(K-Means)
    ) U5 \+ X  [) t4 x4 E这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。5 _2 a7 O% h  R1 P' U0 N- A, t$ @  t

    2 ?: v- E4 O% v# v$ J& L) h6 h2 ]3 j还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!1 o# \, k4 G8 N/ b& t/ K

    * t) F( d+ c, L: T. }* S* w  U  d! A. o3 C
    K均值算法如何划分集群:9 H: f3 P( ]' i9 j! D! P' P! l
    ) D5 G( u5 @& K" p& V
    & }+ w8 r; K+ U7 Y2 n. ]

    $ ^$ I4 {! M. K4 X2 B从每个集群中选取K个数据点作为质心(centroids)。
    / ?9 U7 _# C; d7 g3 Z. c9 ~7 |9 \4 P3 r) I4 [, l
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。. e* l& F  g0 V) l
    " O" U. o! U5 t
    找出新集群的质心,这样就有了新的质心。
    8 W' K1 ~- Y7 \" ^1 J5 f
      C& L, q. E9 c0 U& |" z$ {# _重复2和3,直到结果收敛,即不再有新的质心出现。9 i8 K$ T0 [* m
    3 g& d- a( X% r& v& h. k8 r+ ?

    . ?' S3 m! Y* H怎样确定K的值:0 ^' `8 m" G8 x6 h  X- S

    ! j% _8 M* i! J' |如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    & E" l7 ?3 K$ T* }1 |% n  {; q; N4 [9 t( l* a) x% c
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    $ W( u1 |1 g; a1 g! i  |+ w/ t4 r) r, p7 g# N# U

    , }$ ], L0 A- Z#Import Library
    & o: i# ^2 n: \9 h' ~' [) Efrom sklearn.cluster import KMeans9 [8 w$ e( v5 O! q! L# g0 `. e3 \( K
    * ^8 G8 k4 Y  \1 N* n+ }9 L
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset4 ?0 Z& Q( M9 N  |0 k' y
    # Create KNeighbors classifier object model 8 \7 g% C" G! ~; }8 u6 J  |
    k_means = KMeans(n_clusters=3, random_state=0)7 U+ U+ |4 G& X" v5 u+ u8 P. n

    ' m7 i! `- t! }: B% J# Train the model using the training sets and check score
    : b! _: y% s' ]- Amodel.fit(X)
    8 L/ I0 E' g; H! _3 m: M, O! _
    # u. d4 \- ?, U# D  Z#Predict Output
    ( ]1 \4 n! X$ Q  C8 W) ~predicted= model.predict(x_test)8 ?7 |/ c8 j* f; d( X0 k) p
    8.随机森林
    2 L, i* |0 b, x6 P4 _随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。8 ~5 p+ [8 s- e) ~& X3 o1 a5 F
    0 q" \+ l0 P) B; Z' v
    怎样生成决策树:
    1 z# ~6 r, M# E- Y9 W( Y! ?# j/ I: n2 |4 t
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。- D7 i0 Y- E+ c# K" R

    " J8 d$ Q4 ?( Q# J& F" C; M' C如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    4 b5 L7 o0 J0 B
    3 j5 z  L- a4 S6 h2 l0 |5 x每个决策树都最大程度上进行分割,没有剪枝。
    " D/ I! O. C8 L. ]; u7 m5 h% W  W9 n4 _3 y1 p8 |$ A
    #Import Library2 G# T5 x5 w1 e7 j* g
    from sklearn.ensemble import RandomForestClassifier
    5 |# m* T: Q5 E' L#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    7 t, f# C' u; U/ Q) h3 J# y! @+ a  U, L) O4 l) S0 t- o
    # Create Random Forest object
    ) P6 t* @4 c- b8 R1 Lmodel= RandomForestClassifier()
      w# W7 W8 A) T+ A$ b# X! G  }/ E: }2 O# ]: J3 h; \! G9 B) R# j- [
    # Train the model using the training sets and check score9 T7 i& u) B+ I4 f" V
    model.fit(X, y)7 \! ?& P& \$ w2 k/ Y
    ( G' `  Z# f/ a4 w4 R& K. r  Z3 Y
    #Predict Output
    & T  G- W  A* V0 E/ kpredicted= model.predict(x_test)! D. C6 h1 V6 V! i0 d
    9.降维算法(Dimensionality Reduction Algorithms)
    ) d+ n$ ~* C5 W4 x) u在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。, Q# u9 [' A6 r8 v  L

    ( B5 t2 Y) f6 u' C例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。5 \) ?4 A6 e9 a5 d' P5 @, K

    ; n! C3 f2 ?3 X# R1 J1 ?3 P作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    9 G' s9 t8 p5 ?+ S( [
    & m$ \! V% P) L4 P2 T
    + K8 ~7 j1 q5 k) `#Import Library+ a- O' m/ ]- `# D0 x! l5 b( G
    from sklearn import decomposition
    , g3 ]4 P3 E. g# d4 v2 ^#Assumed you have training and test data set as train and test" j) ^% d  e4 `+ J4 `* N- ~0 L
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)/ K" y5 _- S* D. g& P5 ]- C1 K! A9 B
    # For Factor analysis
    & m  U5 ^7 J/ r( u, j: i#fa= decomposition.FactorAnalysis()# ?* o2 E- J2 E; ^5 V
    # Reduced the dimension of training dataset using PCA
    . r2 N, x5 S* v! D
    ' c7 T0 Q$ f2 l0 d( _0 B8 i( O' e6 Strain_reduced = pca.fit_transform(train)
    & H( i  K6 z0 I. l. N: ]6 N  k0 X0 S) r9 [
    #Reduced the dimension of test dataset
    5 Q7 a+ y- w5 W( p! Atest_reduced = pca.transform(test)
    8 c& A$ q, @/ }/ j10.Gradient Boosing 和 AdaBoost$ C' W7 V# ?" D% s
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。- i1 N7 C: B, G4 Q

    ) A' {1 A; }  h. q#Import Library
    9 g4 U2 \8 J# w* n- ]5 F# Lfrom sklearn.ensemble import GradientBoostingClassifier
    2 E% r- H- p- c#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    " L# j3 z& b* @  N: Q  b3 z# Create Gradient Boosting Classifier object! ?. y5 {! u0 ^: q( k% x
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)9 _. S" Q5 }3 l
    % r' d! g6 S7 G; v) ^
    # Train the model using the training sets and check score
    : C7 P$ M& e1 Emodel.fit(X, y): B7 z$ O7 l* f7 Z! e
    #Predict Output
    / `$ [* |7 u$ u" B+ i+ mpredicted= model.predict(x_test)5 B- m7 S' C5 q: G9 E) L- f
    GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    4 j# i8 X0 Z7 g* ], K+ G% ~! ?2 N) J" S0 y9 Y0 c
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386. u  I1 i. l5 k
    ————————————————
    + @6 w* p; N& m, ~8 f版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; B: Y5 b! X5 a* u4 e' S原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    + q3 J2 c+ |2 q
    1 g4 l2 f3 U: G, w
    5 K# Z4 w" P' I% d+ Z2 K& i5 Y
    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-10-31 23:17 , Processed in 0.177711 second(s), 51 queries .

    回顶部