QQ登录

只需要一步,快速开始

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

    6 J, |. ~5 g  L4 \4 N机器学习算法整理(内含代码)
    9 |& b0 e) P' n; Q$ B, c* B4 W% Y  K+ k- S# U: |
    一般来说,机器学习有三种算法:4 l' A' Q- _3 c8 S! X0 l4 |7 @4 l, l
    , l& `& V% R5 C+ H! w0 D7 g
    1.监督式学习
    : d& E3 ^5 ~2 F% k* i4 C) R8 v4 k* s8 B
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    ( i3 O8 f: F6 M/ u0 [
    9 O2 A1 Y$ m/ }; E1 |+ J7 y属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法. ]8 `+ ?+ i' L- s7 @: V
    1 e2 n6 M( O0 z* S' g: z" z
    2.无监督式算法2 B+ o1 q9 w8 {+ x5 s9 _
    9 V% V0 I2 A# a! a
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.3 q/ E: o4 \0 k6 i! v5 f

    # Z* e. O2 X# a: S2 J- T+ `6 G属于无监督式学习的算法有:关联规则,K-means聚类算法等% {& z! Q3 K9 p$ K6 v
    0 Q5 k& C9 I& S/ s- M+ T
    3.强化学习
    # Q  q- \7 l) E9 z4 U/ \3 P' k# V% v! R: L2 w: \" V& L
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定/ d& y0 s  X- y5 v; [* L6 l
    ; [4 U7 S8 w+ X( N
    属于强化学习的算法有:马尔可夫决策过程5 `' d8 l$ W3 V. n- O- q' d

    , N$ V! P. b0 d9 h( t常见的机器学习算法有:5 L3 f! X1 J  F( B/ _

    1 E' ~8 ]+ o0 [! d4 j8 h0 Q- b7 |5 V6 j5 u) e6 R' X
    1.线性回归 (Linear Regression)
    ( N0 J& h9 L6 L1 ]' p  H) a7 Q# S, a/ y% y- W& \% V/ l1 C
    2.逻辑回归 (Logistic Regression)
    0 ?) Y6 S9 G6 K! b' C- d# k  I' L3 a. t1 ^0 b  n0 ^6 x% m1 Q
    3.决策树 (Decision Tree)
    ' o0 n# x6 d7 H$ _/ R7 ~- l/ O, ~$ I
    : q) E+ |. ]% q8 j5 a  v" Y% w4.支持向量机(SVM)
    + ]- M( c% U7 v* |' m9 y! h0 c
    2 U' K3 \* i; A6 t; ^$ J5.朴素贝叶斯 (Naive Bayes)
    8 F8 z9 O- K% D& z( ?
    4 n$ V0 M4 f/ w9 q$ X6.K邻近算法(KNN)
    + g: ?" E6 z& i4 E" O- x$ b7 L4 }- u  u+ i. Q( F8 \) D& Q
    7.K-均值算法(K-means)
    : H0 |! G5 i6 s, E9 b0 Z1 I) C$ J9 `, i! }
    8.随机森林 (Random Forest)3 }4 {. J6 g" o6 d. y4 C& U
    5 f3 v/ v# X! V3 N2 z, {
    9.降低维度算法(Dimensionality Reduction Algorithms): U9 ], i$ l- X$ v8 u% \; c

    & `* h$ s; p" a$ ~+ B10.Gradient Boost和Adaboost算法
    , g. a% u- `5 v* _% }5 }5 A) r一个一个来说:  ~- Y$ Q9 _% J& V- b+ Z
    1.线性回归2 a! ]- M$ @- O2 F- G3 _
    & S/ U( I2 p2 u# B6 N% Q
    线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.% j1 n9 w8 C6 Y2 U$ x
    * o' Z  y7 V; D2 ?/ m5 A" R: S$ ^
    在这个Y=ax+b这个公式里:7 t/ w9 G% z7 z+ u

    1 x+ I: t4 p1 M( _2 ]! w! E Y=因变量% g; d" T% ?/ G5 B6 l7 Y9 N

    ! ~! W- a1 U' R( ? a =斜率& V+ h$ h# q/ }. l

    8 H7 m- R6 w! Y! V, X5 P x=自变量
    8 a6 `+ H8 L0 \; X# P
    & E2 m7 v; y  d b=截距2 P& y0 G5 }( K2 o# O# z" ?+ U8 ?7 b

    0 l0 }% m6 _4 f  l a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    7 @+ n# K0 q0 d' O% D/ f( P/ R  r  s- M! H0 u7 }& K
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。- M* [& x" G" J

    / r9 i' l/ j& H给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.- S1 o. w1 \, r/ ~
    $ U6 g" u! C/ ~$ ?, C: G1 f9 {
    0 `, s2 ^) ?5 e1 S' J  V/ z  [
    ' j* U/ e3 l8 h4 n$ e2 [
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    - x: Z, ]% X5 I3 x7 B! c4 {- S( z9 K
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归+ e5 s- ^7 a0 P5 Y1 H0 Q: ^
    2 c/ {7 i# \" u% _. ]
    Import Library+ r* Y# J) T$ @6 e5 `& I' V
    from sklearn import linear_model
    4 V. T) D, [, J* z% l
    / w0 ~0 Z( S- T% A% }/ Ix_train=input_variables_values_training_datasets& {. R8 B, \( a# D3 l& l- j, `
    y_train=target_variables_values_training_datasets
    5 y$ u* C" ]: N" w0 jx_test=input_variables_values_test_datasets+ h) j% D: K& {2 f/ R

    0 W. A* a" k( N, M) J& t1 c- W# Create linear regression object
    , }4 U- e. i4 k6 M6 A* z/ mlinear = linear_model.LinearRegression()8 s2 w6 \/ e! x7 A1 e' U5 C/ f

    : o3 p1 n! L+ C: ?: X: I# Train the model using the training sets and check score( m  G+ B/ s% \2 U7 w1 w3 O# Q
    linear.fit(x_train, y_train)
    9 p2 d# Y& n3 Ulinear.score(x_train, y_train)
    , n: G2 e" c2 @5 U4 h7 R! \3 f
    ! N5 j; k+ G6 _( V/ `$ G- D8 h#Equation coefficient and Intercept
    ; l1 ~3 e0 C* ~+ L" _. ?0 Lprint('Coefficient: \n', linear.coef_)
    ( {: H8 y) u9 N5 Vprint('Intercept: \n', linear.intercept_)# |6 g6 B0 _! R& h

    & c& @' t3 d' l#Predict Output' e3 ~  B5 _# i8 ?
    predicted= linear.predict(x_test)% [8 @1 O! g/ ?9 u
    2.逻辑回归+ r1 g5 [1 D3 n7 Z
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    ) x; v* L, Z3 R4 d3 f- g9 B, _4 ^8 }6 m" K, W# R6 T5 }
    同样用例子来理解:- I$ R& t  [3 d
      a- ?8 [* D0 x0 G' Y: A- V6 t) X
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。- j+ d) ]- D5 b4 }+ S& b$ H& Q6 J; y
    ( e' d: y" I; X8 D+ O& m
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧( O6 p1 a8 I3 c' z, M/ H$ D& B

    ) M+ @  w  K9 R* w最终事件的预测变量的线性组合就是:5 q4 v9 F" }7 L: X1 {3 J# ^

    ) b0 s! |6 J. S, R
    2 J0 d9 z  m2 G2 vodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence+ j4 D  p$ \- ^" j. e+ o/ [
    " S0 D& o& O. X( N+ G
    ln(odds) = ln(p/(1-p))5 Z2 t! z$ \3 V5 S5 i7 Y5 X/ `

    2 C0 \+ T0 Q' V  dlogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk! ]( D& c, x- [* w9 k
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.
    1 R- g, K6 l" X/ n, H/ ~4 s0 n# R# \+ `# O
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    $ ]' Y, a: p7 `1 N8 @: r2 y; ]4 a9 o' L7 y1 w+ l

    8 I; V: N3 I+ B0 e( T# l
    $ {. s" J  i( l3 f from sklearn.linear_model import LogisticRegression! r6 w. t/ D6 [" c8 u5 ?

    : J. i3 k, W/ {* V0 m8 V model = LogisticRegression()
    9 x: E' z; k) ^, E: y% |& y
    9 ~% O2 _8 P- H( } # Train the model using the training sets and check score
    / O( M" G8 w& [" Z! Q: d, m model.fit(X, y)
    0 l3 m0 Y" I2 f$ N model.score(X, y)3 D! Y1 k. y; {* @2 N4 T) H

    0 k( Q2 e& [% D9 ?) p! q' z #Equation coefficient and Intercept# p7 S% i: w% P" i0 J
    print('Coefficient: \n', model.coef_)+ L) f8 w$ k& t( ^
    print('Intercept: \n', model.intercept_)
    & _; ^( g7 U6 H, k4 Z( ~# V$ T! B8 A: K9 F
    #Predict Output/ E8 n$ G; [* C6 Y  o: G
    predicted= model.predict(x_test)
    3 _. |& _( X0 Y2 o+ U) L逻辑回归的优化:4 g1 `! T6 S" {
    加入交互项* j6 B/ c/ \' A

    / w& `( |3 i( ^2 X" V6 _  减少特征变量4 I! Q& A3 f8 ?/ y+ P
    : G0 j3 B; V/ Y' v, n5 h" t. S# c
      正则化
    0 y3 k: b" H/ R& m
    3 L1 D. Q$ J2 \  使用非线性模型% I/ Q! E- ]$ D- j
    8 E9 G6 S1 T  A$ Y( J1 e
    3.决策树$ w; s  a# ^! u
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    , u0 G& }/ _  v% h9 c2 w' q. N# f4 f; w/ g

    ( J# [+ J  k# f, d8 k" S( P+ F  i: H, V( l
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    7 A5 Z, U+ T# M: a: [- m4 H" U" y4 u5 k' K" J2 y

    5 t* `$ Z& F- b% ?% |% X  Tfrom sklearn import tree
    ; L/ k- R- U5 j; v% |, k$ C& o, B0 j# F* a$ w- t; M

    & T- |: A  t2 u0 T- T& U6 R9 f# Create tree object
    & `& K# ^" z1 D6 H3 M- I9 fmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  1 j, K) X0 O5 L5 \! z

    * e" A7 m/ |0 @# model = tree.DecisionTreeRegressor() for regression
    + K1 V/ r( v" C% r" r0 o! w: ~  C/ \2 W/ p# j6 n% X2 P
    # Train the model using the training sets and check score8 i6 x+ W& _; H$ N  L1 D
    model.fit(X, y)4 D1 L# K) n# ^  |
    model.score(X, y)
    1 ]* l) m" s% `- t, c" h9 u7 X. n
    #Predict Output7 \& C" d  d# H+ M/ h" ^. p
    predicted= model.predict(x_test)
    " P* ]( |% s  w( e/ g# V4. 支持向量机(SVM)
    1 j1 J4 Y) _. `& R8 H1 j% |+ y6 e$ c这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    0 j; V; M! w& B" F& |% U+ h1 V6 R- X& K" s' ~! H( a
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
      s% x1 C6 Q1 ]4 Z. ?$ l
    $ n% u$ W2 Q; U# r8 F
    9 x8 t& U% A" f0 K) p4 M4 j8 V
    # x0 }. L7 k, B  B$ B在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。5 |1 _. q: x; u/ L( Z+ ~

    / B5 X; e/ K+ U2 U' t% w#Import Library
    4 u6 C+ e4 @, Vfrom sklearn import svm8 w, |! E) J9 }1 a# r0 U/ c
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    - E% w. b0 ^( R+ d# Create SVM classification object & {' A- H. m, F$ c1 m0 p) g' d
    2 @  j, _6 g$ E2 W1 A4 h  t+ V0 o
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.8 Y( Y, y7 m+ F3 j9 p
    ) j) b& {& T, j, i+ }# Q
    # Train the model using the training sets and check score7 C4 o: L  J- e
    model.fit(X, y)) k2 P1 L, s4 `) c1 o- w, w
    model.score(X, y)$ G" V4 L! {. t5 d2 V2 i- A$ J

    9 Q9 |" T0 v; u( s2 m7 t3 ~1 C- K#Predict Output
    ! F' O9 J9 Q! H' z: Dpredicted= model.predict(x_test)- w+ I2 t  X9 \' m1 w5 e
    5. 朴素贝叶斯" \3 M+ E, t0 M0 K. l# F! G2 ?3 o! `
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。1 Q+ y! ~( b* L& p
    & z3 K+ z" [7 s
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    + x" W! t, d! U$ k4 Y8 ]; }
    # \& @. A- z% ]$ F4 ^5 L+ f贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:) ~4 s& x+ I7 ~! u4 }1 r

    6 a% ^% p/ M: i2 Q# Z. e$ @2 Y: g; V2 x7 Q' K
    P(c|x)是已知特征x而分类为c的后验概率。+ i  B* I4 e2 u  r+ t
    ; A5 u4 L' c+ g0 K" R
    P(c)是种类c的先验概率。1 ~4 z! d* v7 G0 b. R4 ]" a

    . E4 b- Y; t7 m/ ^+ ^9 Y8 pP(x|c)是种类c具有特征x的可能性。: m8 @% O; ~" A* b8 O0 Y- K7 W

    ' t% f# |& H) bP(x)是特征x的先验概率。
    7 S/ t( }* O; P# s! v. X3 F5 X, f. Z- I& Y* t$ f& D

    . A# g, I) N& e# t例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    ! W7 Q2 i. F0 m- ^6 ^
    * e% E5 B/ ^' @0 V! ~& p步骤1:根据已知数据做频率表
      ]) f- \# Z$ j4 x2 o( W* c3 S5 ]4 U! C/ m) d9 B& |1 R+ y2 @
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.) T" t  P$ Z. b( f( Z" S8 M3 G
    3 h5 `/ L) x/ |2 g$ y# O+ [& S& Y# X5 A: F
      K/ M5 W$ l7 j0 g4 `- R5 x
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    9 R$ Z& k+ Y) |; J7 [9 k9 [1 I提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    * ^6 D& U* E" ~7 \+ S" d
    3 e  v2 v( B* _# n3 ~/ l! P我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。1 g+ ~8 S1 j9 U9 C' j

    8 @+ p7 q6 z- U0 Y( z这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
      v$ ]$ _. N# r' ~
    ( _) O4 Q) }/ S% f% W那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。; o- s$ [# [" E3 v  g5 S, ]8 o
    5 t( N/ [  b  q" j: y" N
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。5 ^+ T) z) S/ q

    1 w) H" S& {& S2 |9 Z( K2 M+ i# _#Import Library; y) d6 Q" |5 U/ _+ H* X$ n  R/ G# y
    from sklearn.naive_bayes import GaussianNB
    7 p( F) Q' w4 F$ O/ x( h#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ( T9 ?  b& k$ i" N4 J& g
    5 m- o/ L4 v7 k  e2 }2 v# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    9 R, g- [1 u) A' n- l" `; x0 P
    ) B( Q( x5 H2 S& X7 B# Train the model using the training sets and check score- b: J+ e1 M$ @2 ~9 B2 W) C$ ]' E
    model.fit(X, y)
    # i% |1 c3 E! B0 H
    7 a' \5 Y0 h. Y" p! i7 i0 C#Predict Output
    1 b" [' L2 K( x/ L2 A' g8 W% cpredicted= model.predict(x_test)- a0 J4 |; R$ I5 @
    6.KNN(K-邻近算法)) m& c' L* s! n* z6 X, I
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。6 Q9 y- n" U3 L5 e- `/ U' C. J
    , x' Z2 T3 {5 z8 l9 r
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。/ o1 H- P7 v8 R3 ]3 d% y

    8 s$ F- `  M8 ?2 y. f8 H
    5 B; b+ G. v* ?; k  z; `
    : l, V5 A, i6 B( IKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
      ^9 T5 k9 a$ R
    & k# J$ P0 p. B) j5 _; o在用KNN前你需要考虑到:
    " E5 e6 z. C- k% s3 D4 E7 W2 P6 F& r! b5 E: N( U$ L+ M
    KNN的计算成本很高2 v4 d! i7 B' l9 i# w
    ; ]8 f* Q0 b) T+ e
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。# X, _1 e) s( \7 C/ U' T

    - M0 \- f5 e. s; b在进行KNN前预处理数据,例如去除异常值,噪音等。7 P# C3 E) c, V7 z* L, C7 ~
    ! r- W: }2 x1 j' E% E
    #Import Library
    ! p; j0 t# k- G- m6 j* Rfrom sklearn.neighbors import KNeighborsClassifier
    ' n3 D; \  j/ \/ D1 L1 ~2 @% P- i' D( X$ G$ H! e
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset) H9 S  [5 r$ _$ `  `
    # Create KNeighbors classifier object model
    4 `" Q3 P0 k' }) D2 ]& ^
    ) Z9 J! z. q1 YKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 51 W2 N6 r' ?% e' I
    . y7 I! G1 V1 z
    # Train the model using the training sets and check score8 s# u1 }) ]+ F" J
    model.fit(X, y)
    ) v4 q* A+ i9 V% Z9 y; }  T9 a
      [7 `+ F* b& _4 X5 F/ _" {#Predict Output
    4 Y$ Y3 o- U! W1 m& G4 o: L1 k) P3 ipredicted= model.predict(x_test)2 k* g0 e6 Y" r) y1 x
    7. K均值算法(K-Means)
    * S" X1 W2 [  j$ ^5 w这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    # J4 b+ f) p5 O0 H. R4 S
    & v( h' D2 {0 |" |# N' f5 Z) w, `+ ]还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!/ A. I. O# L6 f& @3 s

    " n5 G' \5 l% K4 w* l0 F. `3 I' Z3 ~
    $ V$ C( W# u4 w; d! N; }9 hK均值算法如何划分集群:
    5 [# l# |; ^4 ~# Q( N( c
    1 w) K: p. D* m! H. z. c
    5 ?/ f7 w1 y. H/ r0 @" I
    7 n+ ?: o! Y' w; }1 f; T6 g从每个集群中选取K个数据点作为质心(centroids)。
    3 W/ [1 I" p2 R; b, M% |5 }. A! k* p$ F$ [
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。1 ]  R' W, z' {0 J( l5 d
    - E" @" h+ y% o  B# V  P
    找出新集群的质心,这样就有了新的质心。
    ' V& r: Z; L9 F" q! {4 O- o( E
    & Q# Z+ n2 x: e! {; u重复2和3,直到结果收敛,即不再有新的质心出现。9 z) g4 ~3 O" K  }* Q. T+ ^( D
    8 [% {+ F; W5 C) l9 o# m* b8 F: [
    + Y; [) f- }5 w8 q  X# t* y
    怎样确定K的值:
    , R- k/ N% d7 q4 S# z
    . D5 x6 s# m. o3 B如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。5 C% y; |- I7 I& v& F# b4 |5 M
    " ~& j- }7 z$ \" h
    我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。$ G4 c8 p6 ~) T! z. `& F
      f- k6 `( w* q
    ' k+ a- [. `& B, o6 T) f
    #Import Library
    8 x8 z& k, q' P$ J3 N8 t/ d) ifrom sklearn.cluster import KMeans2 F% z3 I: q7 j
    * x7 M$ w3 T4 h: b  a6 S. h# s
    #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset" ^- J5 t  d5 D! y( Q
    # Create KNeighbors classifier object model
    ) ?8 X9 c. p$ u7 }/ N0 X0 Xk_means = KMeans(n_clusters=3, random_state=0)3 |# h: x# x  Z* n" u
    5 y* l$ L, s  A! o( j" T( i. H2 k
    # Train the model using the training sets and check score
    - v8 C4 ?4 l& T% d/ X$ V8 D$ Hmodel.fit(X)
    * L0 r' k7 G( M, J& ^8 z: @8 f. M- @4 r( I2 {9 |# q
    #Predict Output+ Y6 y) {; t( Q9 A) B7 s  F3 i
    predicted= model.predict(x_test)
    ( I1 {7 A! H, f6 P' P  S+ ]6 L6 B8.随机森林4 o+ G1 X6 k& {" D4 W4 t
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    ( g$ e$ Y8 a" X: b) e# e( I5 J4 t, r+ Y* k5 A" b
    怎样生成决策树:
    7 X# T( O! b% W7 A  Y
    . L2 ~' k3 X- E  p2 e如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    ) i) p/ H/ g8 ?% K/ S+ l3 l( }& i- m+ W( Z- ^$ n* W/ s2 T. I) L0 m9 V
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。" ~; z. _) M2 o) `( a# G6 o

    , V4 o0 b7 \  q# Z每个决策树都最大程度上进行分割,没有剪枝。
    & O. e9 O& l# @, E5 e0 H" |( h2 s/ [: C8 }+ f# h
    #Import Library) w6 S1 C* A1 H9 c% j" r
    from sklearn.ensemble import RandomForestClassifier
    9 }- @! @1 p+ z1 N  _( y( [. B#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    7 `1 c. s5 R9 c; h: N7 i  O/ U
    4 p" R/ e8 A2 D# Create Random Forest object
    + X) a) G# F5 e4 b) k: ?9 D' G- Omodel= RandomForestClassifier()' X6 ?5 v" w! q; j- |, J

    : W$ c$ R8 B7 U* {# Train the model using the training sets and check score0 @2 z' A& [6 z
    model.fit(X, y)3 z; f* h' r; C' D1 v# e4 W1 I
    5 M' a3 @8 R  y& C8 E0 B9 k
    #Predict Output
    " k" P" s* h" ^predicted= model.predict(x_test)
    . n8 ^% {6 }# G: A6 E9.降维算法(Dimensionality Reduction Algorithms)9 [! z2 [1 J& z. I( p7 M0 i- L
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。+ U" e- Q0 A5 ]' H! R
    2 t, I1 d" e8 L, E
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。8 u9 M1 t8 ?# i' ]. {% L: |* i: m# c

    & z7 s( V+ g% R, h) \作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    " R4 t( J/ a$ S" ?5 e8 ~
    " E0 h9 v$ \1 K+ k$ Y
    6 C6 R/ J) E  A1 t2 b3 A#Import Library# ]- Z( K. }1 W4 O6 t6 z
    from sklearn import decomposition' |9 A: Y  D" g7 x$ C' x' A
    #Assumed you have training and test data set as train and test
    + B2 Z- Q) {* K/ L8 p  W2 D7 n# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)) n- I7 |4 Q* t, y# ~
    # For Factor analysis+ h2 V( t! c# K% x( L
    #fa= decomposition.FactorAnalysis()
      j2 T+ u/ t* k2 S/ Q8 p2 ?# Reduced the dimension of training dataset using PCA
    - {5 H2 F7 a: L" W, M& s0 Q" S. c: H1 a/ ?- V/ b- b0 @
    train_reduced = pca.fit_transform(train)
    : ~" Z) H  g! [! G. z( R' V* z6 w; ~- L3 G0 \0 B& W5 I
    #Reduced the dimension of test dataset
    4 S  [, _% J0 rtest_reduced = pca.transform(test)
    6 h3 @) g0 t, {3 _6 f; d# X) Y10.Gradient Boosing 和 AdaBoost
    1 D8 y% z. O% m" I& kGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。2 j: Q, ~9 H7 S5 k) ?

    ' q/ y2 r0 Y0 P* E#Import Library
    ; Y3 W+ g; l# s) R/ nfrom sklearn.ensemble import GradientBoostingClassifier
    3 U4 P: w( H/ k1 z' }#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    $ m# l  g. d3 d( q) F8 \# Create Gradient Boosting Classifier object% G  P3 C+ ?  w' }! {: v
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)( Q* W5 p+ W0 V; k$ H1 b
    3 R0 e9 z% Y, i3 [/ A& `2 }8 ^) [) a
    # Train the model using the training sets and check score
    + L" @( U8 x% Umodel.fit(X, y)" Y& T# l0 c. K4 H; J7 H; v
    #Predict Output: I+ m# `: ?/ d& t9 |) r: K6 d/ h
    predicted= model.predict(x_test)
      S" K$ {/ s1 D& ?' D# ^& d/ rGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    8 @* }1 F  l1 Q# o
    % ]3 t; x: M0 N  q0 P! E原文链接:http://blog.csdn.net/han_xiaoyang/article/details/511913865 v, X! z# I) x9 ^2 H
    ————————————————& M2 U; G* b( v+ e: A
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 q& e& e7 h9 ~原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    4 g; m! J* Y  g* g# V/ Z( A/ J& O; I* o4 Q! u& _6 d( D. d

    & z; L$ y2 i2 G, Q
    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-9-8 07:54 , Processed in 0.316166 second(s), 51 queries .

    回顶部