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
* 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