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