在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564650 点 威望 12 点 阅读权限 255 积分 174618 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
5 d# V5 F+ N o1 X 机器学习算法整理(内含代码)
% N$ m0 S7 q4 V' o2 ]4 k 3 j$ y- q f* ^: Q X
一般来说,机器学习有三种算法:
0 @5 A! G' ?4 z# @/ P : B0 w- ]+ g$ [2 h( m6 b8 r
1.监督式学习
+ h9 d5 S1 @& H / d1 k0 _1 S. j% D
监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
7 ~/ K; L& T5 M4 B ) b! E1 m$ @! ]' }4 s; Z2 K+ M5 w
属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
. t; D0 t* ^1 t/ Q/ M) L& `" }3 g 1 Y$ u+ \( B, u; Q: d* Q4 N2 |* i
2.无监督式算法
) v/ Q- S( K$ R" f& P
3 X- F; c Z+ b. e- F4 ~- G 无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
3 h7 z- K* M$ C& \; f7 _ H4 F$ F, Z( l) m# B! l: |
属于无监督式学习的算法有:关联规则,K-means聚类算法等
$ k2 `( Z+ r- ~! M5 Z2 d 8 i) o }! S5 g: O f, m
3.强化学习
$ I) G! G4 H. `: M9 Q, b+ k 6 s% J3 G2 {4 \' J4 S
这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定6 G J1 l7 H) f7 a& o
; ~" q3 B7 B5 E! i) J' ^ 属于强化学习的算法有:马尔可夫决策过程' n8 n# i @6 c! D9 a3 b( A# ~
5 ~& X: V* @* k+ S {# X T# R% l! ` 常见的机器学习算法有:5 c3 m+ ?1 T9 k9 S& V! ]' {; e4 ?
5 O5 E8 L0 U' Z. l, q9 k9 Q
v7 u- a9 i, L/ Q' X2 ]2 W- x
1.线性回归 (Linear Regression)
) @" U. P' ]2 K& N6 U" f
3 D+ e! ^; J+ c% M$ {# g0 _. U 2.逻辑回归 (Logistic Regression)% y6 D/ N9 a f6 [8 @% Z) D, b
( Y1 q# j$ x! T( W 3.决策树 (Decision Tree)
, r' c3 ~2 Q) `# s ( l4 h" l R3 x
4.支持向量机(SVM)
9 n. K" w- V6 {- k: m2 s' q* W
! @1 L# d% ?0 k/ d7 C5 S# j& m 5.朴素贝叶斯 (Naive Bayes)
- ^ i/ {2 S4 B# `# z
2 e3 O; k8 x) f2 ^9 M i/ S; u5 D+ } 6.K邻近算法(KNN)5 U( U0 e# w' n) p8 g9 b. i1 Y
$ c: |- E; m* |4 W. i7 a2 \ 7.K-均值算法(K-means)9 M7 `2 w1 r7 H; J2 k4 h8 C
% {& t" m3 G6 r% J! f+ f
8.随机森林 (Random Forest)! g9 H2 h: ^2 x
, D+ U1 N8 Z( O+ E 9.降低维度算法(Dimensionality Reduction Algorithms)4 |; \/ X8 w' j4 Y9 J$ V p& ^
6 a2 K) `8 r0 Y( [
10.Gradient Boost和Adaboost算法
: e. E/ {# {# b 一个一个来说:" B; H# H# A% k o, d4 j4 }
1.线性回归
1 E; `- }2 Q1 i* c2 [' g& h
; w' @4 V4 ~6 ?& H. f, H 线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
/ b3 p4 o! @ G7 x! M W % Y% v' f: p/ b
在这个Y=ax+b这个公式里:% I1 W: z4 d2 L# M, l4 P
4 o0 ~9 M/ W. m: K9 ?
Y=因变量2 t* j8 ^( s- A; i4 g
' |6 p- t! Y8 O: N/ ^ a =斜率
! w/ A/ y u$ ?
( g [- i! r/ R9 V& j x=自变量 r" q* Z8 K4 h, N9 ^8 H8 M
' ~) a8 m7 P$ Z
b=截距
( I2 w# n! o+ o7 D+ U3 a% q - ~0 s$ F7 d8 D2 u2 d* t4 G* W
a和b可以通过最下化因变量误差的平方和得到(最小二乘法); ]! C7 E/ z3 [+ r# R- ~
+ J+ x0 @8 e, [6 F, P& s' I# ^ 我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
! u; i$ ?$ l+ y4 y ; y! z) z) H# h$ r
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
1 u+ }0 K( c& [& A% k' d" M1 k' H: y
9 L2 F( B* i7 {" @$ m # [8 `( I' F7 @$ Q' x
+ C+ {% x% e, ~" |
线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
6 B; j, w. N% _; l, x6 p. c* z ) T! I$ S& a% a* s4 K4 M% p: u$ S% E
拟合多元线性回归的时候,可以利用多项式回归或曲线回归
* Z0 h' @+ p" N5 v/ p/ I
5 m5 f8 ?' f1 X6 w5 B t Import Library* Q/ c0 F/ R8 N8 R3 h+ {
from sklearn import linear_model i2 [6 Q" E9 m# r, ]( m
6 v0 a$ j% }3 O- o/ C( K
x_train=input_variables_values_training_datasets
1 s. [% `$ ?7 ` s0 s y_train=target_variables_values_training_datasets
" c |. Q( Z9 Q x_test=input_variables_values_test_datasets
0 r9 S# S* ]) N$ i- O
9 X( U$ W* J. Z3 `3 V ~" v # Create linear regression object
; g! h0 Z$ M/ n0 t5 X- ` linear = linear_model.LinearRegression()
7 O8 J7 b% j$ ?1 U6 s! G / r7 L+ d2 e5 h5 N- k1 q/ L5 J% {
# Train the model using the training sets and check score) q0 W: P E) a) n4 L
linear.fit(x_train, y_train)
- ]+ r# W( A. Y: R7 B8 a* L, V5 l; z linear.score(x_train, y_train). T' j1 _, P8 `6 V
0 H7 s( ] L# Q0 g3 s$ b
#Equation coefficient and Intercept
% ]+ z8 V9 j6 F9 y print('Coefficient: \n', linear.coef_)
0 L' p/ ]. {. j- b1 I4 |1 f print('Intercept: \n', linear.intercept_)! I, v# ^. B+ ^( A, Q: p
6 f# c2 b, ~3 Q L! z$ M, `, @! y% B7 g
#Predict Output5 _7 d+ o- D1 b0 v; ^' p3 s
predicted= linear.predict(x_test)4 r/ a% X$ M8 t* g. Z, }
2.逻辑回归( ^4 }3 ~" q% X2 O
逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!1 b t1 a/ |9 a. p' N
' Y4 w: R8 X% @ r6 c+ l 同样用例子来理解:* i; y& A( Y" ?# M, {0 p; Y
0 |8 k) `5 Q' e) ]5 h( S0 R" T 假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。3 { i+ E N' s. K- f" G
' v/ P( ]0 b0 s7 O4 w
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧6 ~/ q. `# y3 c/ r7 e d) C
/ a6 c2 A1 b6 q3 l
最终事件的预测变量的线性组合就是:$ ~$ p3 ^; @; N# m+ s
4 A/ L* L s/ p5 c - x {5 O; X. X. y- M" _: m
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence+ x* z. F1 T4 C# ~- i, |
, B3 G4 n, P( i! m8 F, O
ln(odds) = ln(p/(1-p))
& I1 w4 X' y( I # }! J" ^, _& J% U. t9 T! F
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk& M- K8 v6 W- X5 d7 w
在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.' F @. p1 \# t, E# F
$ m. x# u; } J( @( @ m ]
至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
; k5 s- O/ f L7 \0 r) Y / V+ C& ?0 [# x" M: P0 M
: u# y" u8 a7 b3 U6 ` & N" k& R! l1 H2 A5 ~/ P/ ]1 R; ^
from sklearn.linear_model import LogisticRegression2 z5 g; u0 e, K) Z/ I! {' V; m
' u) K: _0 O, I; j: x model = LogisticRegression()
& L8 \% L1 q h
7 u" }8 F6 o/ w! Q5 ~! k, _ # Train the model using the training sets and check score* i0 {$ ~& ~7 x$ K6 ?4 v* \
model.fit(X, y)$ I3 H8 p( `; N
model.score(X, y)/ l1 Z6 q# ~ O0 {
5 h! x0 C+ `6 e3 t$ Y! v+ a; s
#Equation coefficient and Intercept
- \/ m. L; n% B5 y" j print('Coefficient: \n', model.coef_)
$ k! J8 i/ C, L4 _7 Q print('Intercept: \n', model.intercept_)" l* {1 W% h9 C$ L/ k
0 s2 I6 q, ^- L+ [- K* v/ v
#Predict Output
5 ]) q K% T$ C' c8 p! f predicted= model.predict(x_test)
% w2 w1 |. W! { 逻辑回归的优化:
, w3 Q& d$ ?5 j! c6 X' R6 ^0 U& f0 [ 加入交互项
. ^# d' d2 {+ W1 s4 p: m6 v
3 S! o* f+ J2 W# b* T 减少特征变量2 s" h1 C* Z7 ]; V/ ` t( L$ M1 ?
u3 d. W" A) d* r
正则化6 a5 E7 z; g- y; e( P! P
1 Q0 U+ m1 ]* |3 E 使用非线性模型& o( {0 N+ D9 c
' s) Z9 I* r! x" T2 o$ F
3.决策树7 x: I1 r. L; ?* n3 K
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。7 }5 j7 T7 |( v, O, I
+ P3 c+ k8 B/ m4 X
5 r/ A {. T( b8 A8 p& h2 T3 U7 r , ], Z3 _7 z9 I% [7 C5 U4 I% E
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
4 Q6 F9 e: L8 }6 C
$ H W" H ^) c
$ z }# m. ~( I: j from sklearn import tree
2 n9 |/ i N! v
. y3 i8 C5 g8 U
: p2 t+ E* n+ G5 [0 L! I9 n # Create tree object 8 N. b0 W( N( Q* L
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini . Z3 P' n! z4 f) Q+ b( |
# b( Y8 \) M, r; l
# model = tree.DecisionTreeRegressor() for regression
. A/ `# |. E$ Q8 ]. G: }, U2 p! t) z 1 o! v' H- D/ H" }' Y7 ]1 P
# Train the model using the training sets and check score
) T& z, t/ j; i9 Q6 ? model.fit(X, y)& t1 E6 m* A5 ~+ c
model.score(X, y)3 ~. ~& @! U) {7 W4 ~4 k/ l
. l- A [. p9 i& Y- T1 i #Predict Output
+ Q0 z" o6 U! ]. K7 ^, f predicted= model.predict(x_test)
. Y# X* r! t7 B$ Y 4. 支持向量机(SVM)
( B: r- h7 v9 }( I- r: m 这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。& g: ~/ }1 O7 A: W. g1 M, w6 t
1 F2 x* C% U$ o7 C
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
" P, ` p# y9 E5 o/ z0 ~! o
. I) V6 v6 a3 d0 C( [; L $ A' Q, r3 o8 I% N* `# F
) G) N) ~ t: I4 R6 d; Q 在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。1 a3 d( p h, T
& _6 W. v- d% n7 _3 b( V #Import Library! a: x+ G7 e8 I# Q! R! K
from sklearn import svm
$ @4 H) x* h" k! d: k' e #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset R1 S; u& @/ Z% r
# Create SVM classification object
7 K$ c( g7 U/ s% X: W
- K! b% a, D( h; ^3 r# E model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
/ Y0 r# i+ t- K / q5 X$ R+ H- v3 w+ M+ l
# Train the model using the training sets and check score' x6 T( u* J; @: B+ I, `
model.fit(X, y)
5 q$ Y- O# g- l. q8 { model.score(X, y)9 ]1 i* e$ V. h, v
) p% Z) j+ F1 K5 N8 w# R
#Predict Output: `1 Q6 A/ ~' X( T) O/ O6 }
predicted= model.predict(x_test)
( K* p6 [ ?& |. w( y# E 5. 朴素贝叶斯
; T \( M0 C7 u3 [+ M 这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
# ?; s6 o8 s, ~0 V6 i0 x0 \# I# R
( X8 v1 C8 K" }1 y: I/ a d& \ 朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。' h: A% W$ L7 A5 e! h2 b$ T
; W. |8 Z/ {* |) d1 s/ L" B4 h
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:# a7 Z. `7 D" t H" L8 k9 e
- S& j; x5 g# V6 Z3 @/ e$ y
" R# @( z9 W/ A/ [+ [ P(c|x)是已知特征x而分类为c的后验概率。4 t, ~! F9 x' U* d* Z5 n5 [+ e8 k/ T
' W9 B; F3 E7 j' |$ Z P(c)是种类c的先验概率。
' f1 `! X" W5 S/ i( `% x
( {- g9 c7 ^5 d% _ P(x|c)是种类c具有特征x的可能性。
5 v Q! V) E4 T3 ~+ W 6 x# [+ K+ I2 e9 [! J
P(x)是特征x的先验概率。2 ^8 I& Q ?! }, f
5 z$ ~# r) ]5 K8 a( {) p2 a
/ ]( ]& Z9 E W2 N/ i 例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
4 e: r' j5 [1 I. o
( Q/ q8 J* {5 M2 t 步骤1:根据已知数据做频率表
5 q' m8 |) b8 ^# h9 K
; h. E& J/ b7 b$ x3 q$ x 步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.- ]7 G: e* f) e
8 v( {( \7 H3 U2 L( W
9 k9 R. d5 |1 E 步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
; ~+ V+ V+ p0 _5 Z" x9 w 提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
' [& \' p0 \0 A/ I3 i) F& c ; H+ J1 Z% I) J9 h: G
我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。1 l. A# |) f% p+ a
4 _( A& F/ \) z/ v- r4 k" C* ? 这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。# R! @# b( F$ [' M
* ]& z& w8 A9 l% F% u9 o
那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。* l1 Z. P2 [1 C) z7 C3 L
$ P9 |/ c* m" {) {; i. B9 \ 当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。7 [$ x2 {, W8 ^8 h0 [( \- m
2 s7 A( N* `5 A
#Import Library
- ~6 ^- n5 c5 t, f" ^" Y7 r from sklearn.naive_bayes import GaussianNB: i2 m4 ]; I+ V1 ^/ M
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
. L0 [5 c* y" ?. Y8 K1 w # x9 G% T# A3 F1 a1 `! |
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
2 T/ Q$ o. I4 O9 t
& V# Z% ^; R* @5 A0 b g# H # Train the model using the training sets and check score; K! \/ i; i% ?2 b* \6 A$ e
model.fit(X, y)) Z) r v& H& a |8 C U
- W1 U5 X/ N1 _1 ?. F
#Predict Output; F- m! S- p/ U% n2 [0 c
predicted= model.predict(x_test)
+ o$ O8 P f1 N 6.KNN(K-邻近算法)
7 P3 B* X! ~' P- x$ Y ~+ z 这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
) u+ e* n2 X: G ^# D4 T
' z4 s/ Z$ A7 u8 c4 D& ? 距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
^" d) F2 C9 a% Q0 H4 |+ p
8 G9 Q: l( G- |& ?1 W8 j
7 E& R9 h9 j1 G2 J2 f8 }! z ' U o/ s! R! m& Q# T
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
@, v0 Y: p8 p5 Q0 h" S
b6 m+ ~8 _& i2 h2 t5 `/ [, F& y 在用KNN前你需要考虑到:
, D% x# X7 y- e7 g. m" [6 N" z( g' {
0 S E$ H7 R& p! Y( K, [ KNN的计算成本很高
7 Z/ A- V# `$ c+ \. N. p; E 1 E. F: ^8 n/ Q
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
" h/ ^. I6 I$ r" j! d0 Y/ | 6 N. S+ @8 l/ y4 }3 t
在进行KNN前预处理数据,例如去除异常值,噪音等。
4 w6 J( D; e7 b" L. B8 i
8 K3 V$ v7 A2 \1 u$ d #Import Library) b ?: E" t/ r0 B
from sklearn.neighbors import KNeighborsClassifier
3 ]. A' s$ R) a
/ G4 O [' \( ~ ` \( ^+ a* x; P* F #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
; c! { }' e, R6 Q, a # Create KNeighbors classifier object model
& q# ^ B! v0 I- f4 h
! g( N# y! R5 i0 s5 X KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
' v5 D5 w6 b& _! J% b1 l" n : a ~5 r1 U u8 l& J
# Train the model using the training sets and check score
# B! Z& s( [6 t' ?1 K model.fit(X, y)
5 f, J8 `, U- e2 p1 r: ~- J : b8 f1 E q2 [$ _. x9 }
#Predict Output
* v' H, J$ W" e, r; S predicted= model.predict(x_test)5 s8 I9 k' E) i, L
7. K均值算法(K-Means)& l* W X4 {: u; A
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
8 Y+ N- j" Z, S/ x0 i5 f6 s; x " Y5 \) I; H- j9 H; v
还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!; b; w. Z7 }' x5 \. @
: e( v1 z! N& P& a- l* p
C5 t) m; Z) N4 C) \5 ?3 O
K均值算法如何划分集群:
' p$ I. b/ j! _
( E8 x; C: _, ^5 d ]- r# K' ^
$ x$ D5 D2 a* A9 J! Y8 i 4 A7 }! v. b+ t" X4 Y5 _! e
从每个集群中选取K个数据点作为质心(centroids)。9 Q" S- ^' h3 H
6 m. \+ z! E! ?. o2 \5 [ 将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
3 f0 p) w' D, A; r9 v! d : H3 C9 U9 [" @1 i
找出新集群的质心,这样就有了新的质心。
. }% ? S$ c* M) `; w# {
2 ?3 c, j4 z' u4 J* P1 ^ 重复2和3,直到结果收敛,即不再有新的质心出现。' p. T7 r4 B, y7 j
! |6 w2 v7 w3 o" R0 P8 w& f: a9 e4 @9 s
# C: z( _/ c- l/ K) _ J 怎样确定K的值:
. t! E8 S9 v8 ~9 F9 m" u
( d% B9 E1 }2 S+ D* C: x2 [- n& e6 u 如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
2 ~ t+ y9 Q4 d* D: E
( O& i* F" K7 j8 s6 u 我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。: t0 ]$ `$ T' M$ Z7 }2 D
9 g3 A8 v. W% a* c9 o % h" ~: y+ y3 b+ H0 q2 b: n
#Import Library2 J1 h3 A p5 n+ m3 w' D
from sklearn.cluster import KMeans
) t2 H7 ^, i! f# T; ~
7 `/ T# H1 k0 q' X #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
3 }/ {, p, F: o # Create KNeighbors classifier object model 2 C1 m2 g+ Y* M3 T$ n$ m
k_means = KMeans(n_clusters=3, random_state=0)
5 f8 }& v7 q7 H" h' x0 J $ N- E( D# b# |' D) o
# Train the model using the training sets and check score8 M5 k5 P+ A, y8 M) ]7 c( {9 t1 A
model.fit(X)' C5 N3 k: h2 L2 W9 A
5 h. m- `! m" S2 C; D
#Predict Output8 ^8 Z, r7 m0 N7 s* N4 m5 C
predicted= model.predict(x_test), S2 z( ?6 M% O( }4 f$ o$ o& h
8.随机森林9 Z! W* E$ ^' R$ q. a3 E) G
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
. i; `0 ~- q1 f, w 8 z) {1 Q2 F; T% b1 m
怎样生成决策树:4 I m; a5 B( J3 N9 E& F
8 |! v4 Z6 w9 `( Z" m1 ~* N) t4 b! k 如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
, a) w5 h* m/ X( B) T
1 Y9 g+ m7 A3 ` u2 t5 Z! O 如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
- s- L2 t2 N5 r: A$ z- z. m 0 K- F& E6 o4 K3 j
每个决策树都最大程度上进行分割,没有剪枝。1 l1 q0 y8 a3 [ O. m+ s5 Y o4 H" c4 O% e) F
4 l3 Y+ }1 ^' _1 @% n #Import Library
" n) ]- n+ Z; B* e( g+ v( Y3 ` from sklearn.ensemble import RandomForestClassifier/ f$ q+ p& u: U% c( Y
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset: _' }3 r9 Z) Q# }) y3 M! M; c
, o$ G: k0 ?' B8 I& y# k
# Create Random Forest object& g% F! s: M. I2 D# }; Y3 ]+ }
model= RandomForestClassifier()" D! B6 n2 ]: l2 U
0 |& H" Q- c Q3 \) e/ s! y/ n # Train the model using the training sets and check score; P8 H7 d( R. |' I/ i2 q
model.fit(X, y). w' z3 A9 N4 H" }3 B
8 y; z5 @1 q' K
#Predict Output0 L# U2 W/ d0 \4 y( M4 k0 {
predicted= model.predict(x_test)
6 V' L7 F6 }5 u6 j 9.降维算法(Dimensionality Reduction Algorithms)( M! n/ d% e/ ]* ?* o; g: I
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。( ~; N( P4 ]* e2 S2 N X
" S c* o" t' h5 b2 }+ @ J$ H
例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
' Q' k6 ]$ m5 P9 o, h9 j: y
& M: ?5 j" B7 c8 }: {, d2 E 作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
+ l- F6 D2 `; }+ w! R 6 C( j1 K- c9 V
! l3 F+ u% C( M8 c1 n" D9 z% V3 O
#Import Library
. a. u* D( T% O# u1 B; l from sklearn import decomposition' G% Z( \% Z) \8 C
#Assumed you have training and test data set as train and test
6 S, w( z" _( |3 t% e% W8 E # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
?: {/ f. W& q" i, ^; g # For Factor analysis# f4 C4 c7 @* q9 F$ Q- W+ O
#fa= decomposition.FactorAnalysis()9 j0 s! D! _* M; {
# Reduced the dimension of training dataset using PCA1 F) w& F4 l, n7 E: q
7 w) ], D3 W7 p
train_reduced = pca.fit_transform(train)6 e, o9 ]+ T. W4 C
& j/ w- ?: u/ g1 k1 b5 X# ^% X
#Reduced the dimension of test dataset
7 B" f. N5 u" t0 k! R- w2 n, v test_reduced = pca.transform(test)
5 A. ~% t3 O& _5 P0 Y2 A; q+ |$ ? 10.Gradient Boosing 和 AdaBoost: Q: t- F; q: F6 A
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。5 m* L* }! G/ d0 _( Z+ @
1 ]- }: w. E& ^! f4 ?
#Import Library% o/ P: V3 s' _* C. @1 V
from sklearn.ensemble import GradientBoostingClassifier+ b8 {1 D% w6 o3 [5 I8 R' D
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset! s" v5 \) G. j$ f K& m2 x1 G
# Create Gradient Boosting Classifier object
( i7 ]$ g" \% ?- }+ C; g0 `( P model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
) D: [! s- B5 e @9 ]( B3 B ( @% C. [* Q1 @' S+ ]9 X0 l- Q
# Train the model using the training sets and check score) ^# C; M1 \; @
model.fit(X, y)
: X8 M6 H/ G2 k7 f6 v) o. c #Predict Output
+ ?$ f1 }2 h2 B# j7 s predicted= model.predict(x_test)
! |1 k* O% S( O. o& p GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
9 j& @1 h. W( V- H- v3 b/ B
# o* g- k3 ~9 |; ^ 原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386. N' W( q' x, X. I7 E0 ]( @7 t. K3 r9 h
————————————————
- d' Q0 j6 T9 O4 S [9 p! C 版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 b# @5 _- r/ u( r, u: q' Q 原文链接:https://blog.csdn.net/qq_39303465/article/details/791760754 V; z3 D* C2 f! ]7 h% ?5 e5 D4 j
" _9 `+ y2 b2 y4 }2 ^; b& K
! O4 O' C+ e! d: j
zan