5 s" _+ T- m& _7 ]( V9 {! P4 v: M至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.5 T* M% Q4 `, S+ G! _' {6 O
# l3 w) \6 M, Q% u s: a3 _ j1 O/ L
0 C8 T% s" ^0 T p" M
6 |% d( v- q# s5 `- f from sklearn.linear_model import LogisticRegression : A/ _# p! V! T5 a0 Q3 y% I: ]) M" q/ _ R% l9 x6 O
model = LogisticRegression()' M L7 k& ^9 j6 y& Z
+ v A) U* |( p# Q! o0 I. z/ x
# Train the model using the training sets and check score1 n$ i* h% Q# P E4 o
model.fit(X, y) : R5 K5 b h1 `' U model.score(X, y)6 I8 L0 {5 m' l& `6 Y! C+ ]
) X+ o- X5 J3 ~2 ~/ {6 U4 d
#Equation coefficient and Intercept- t% z7 e0 q8 k: J& H3 E2 R9 i
print('Coefficient: \n', model.coef_)" }9 P/ @7 M1 ~
print('Intercept: \n', model.intercept_) ; E2 f' _7 X. S+ N4 ^! |: v2 i 6 z; _4 [9 L/ }: C #Predict Output ' C1 h# h- O1 m3 _ predicted= model.predict(x_test)0 \) a# r9 l6 P4 ] } c& Z( W; X
逻辑回归的优化: ) \4 E' b9 E, F. m加入交互项 $ p w" U+ }- I7 N + J% j7 ~/ [! ]# e+ v9 @ 减少特征变量3 b9 h- W- r3 B+ K, S; m7 H
+ f, r) ~ r8 U 正则化0 H0 N" O, S8 j4 y
1 i" S0 x% O+ d% Y
使用非线性模型- K- I/ f% Q! R, q9 x6 n5 s
1 |% O0 U& e( u" k) I
3.决策树! T& K( H" k8 `+ P$ l
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。3 n, k. X5 I2 v6 l3 X1 E$ i9 g
4 K% B/ f0 T; {0 k" t' q+ @# v
8 Y/ P( l% e* n' J! g' _& H
+ ^- J: D9 \ y从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。! v6 u6 d' f u- k( {
/ F6 h, Z/ q4 ?2 w) p% ]. w: B9 B' K8 \6 A7 u5 R1 X
from sklearn import tree" }- f/ v$ z. @5 e% T; p
- g1 U' D5 i& p" D
: ?. s; s& S/ p! @: d, R7 s# D/ j9 g
# Create tree object . I* @& ^/ q H) xmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini $ ~. }( h# [: `
. \! A# g9 I; Z1 B3 C6 z- s- A# model = tree.DecisionTreeRegressor() for regression 6 u1 y! m% y5 H \; ^# d # \/ O4 k3 E5 v; y( E; [8 j# Train the model using the training sets and check score # Z& [4 V/ a* s0 y, W' ]0 ?model.fit(X, y) ' a" `2 M0 w" p1 o+ fmodel.score(X, y) % T8 B1 x. `' \* [; v# w# C, d' p8 C6 S( W
#Predict Output$ G4 L$ ~/ G2 c7 J
predicted= model.predict(x_test) 8 j. n0 Q% W6 M: e* K4. 支持向量机(SVM) ! Q0 v" ~- j' U6 Z Q" X" [. \这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。4 d" X! w- `8 R# v2 f
9 Z$ A4 |9 v& J! c F( [$ H现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。7 b# U/ @7 j5 Y
; ?$ v& W; y- P+ O3 S' K + F! D0 L& q& R0 W # w! ?( m5 A# s0 E- F在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。3 {3 t. D, o( u. w5 n
1 B) G. X, C# }' n' R) f" \' [
#Import Library / K" L8 H: ~3 Jfrom sklearn import svm . r6 G/ `9 ^3 p, q#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset5 y$ s8 D U- P7 \: w* W
# Create SVM classification object + Y1 v1 C* O6 X) i' y8 O f
4 B" }5 p! v4 kmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.6 `5 {1 B& K% l! G, h! ?9 s
0 _' x4 j2 {& \: ^8 F3 g# Train the model using the training sets and check score' q2 K3 ^, F9 Q$ \# n$ m2 z
model.fit(X, y) * L, C. D# G1 @1 `$ S$ t2 T1 N( _model.score(X, y). v" S9 K. S* f# r
# e8 t$ P: @) T4 {3 D
#Predict Output 0 l% i1 s" p. w% ypredicted= model.predict(x_test) 2 U9 W! R( z& L& E5. 朴素贝叶斯 4 N7 z: c( d; L- n这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。+ {9 U5 R2 s9 \3 r( y
- s8 W6 ^9 R: D$ C3 s
朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。 1 b3 ?" s% s2 s- Z- @ 3 M7 B8 E) }0 ` M. M0 i& [贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下: $ Q$ ^0 |- H1 O6 Q7 x" ]0 L0 W" _9 v/ ~
* s0 J1 r, r# ~
P(c|x)是已知特征x而分类为c的后验概率。$ W# _+ ?8 \. s" L
: l7 [" g, ?( j1 d- i! E& VP(c)是种类c的先验概率。# b. I M% o; L0 u( P
4 Y& O* o4 C& v3 pP(x|c)是种类c具有特征x的可能性。 5 ^) }6 q+ _; O" E, a, G6 ?, @& T" A+ I6 M* l
P(x)是特征x的先验概率。" L2 F; o* F7 v6 m3 E# u
- p5 G+ S" [7 c3 b0 A& h$ i我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。 # }6 D' i+ v1 o. Y3 p0 s6 `+ ?$ F2 T, a9 r5 r8 l7 J; `
这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。4 U: f% K- Y! V
6 b; Y, m9 {7 R" i4 x3 J; o. M
那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。 ' i. P8 f9 g. U, { 1 O- B1 S3 L+ ~" B/ J' s# E' h当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。/ e6 F9 }3 q% Q4 s5 c0 d
5 w1 |, q9 m4 U
#Import Library* u k) c: q) b2 D5 `# e% t, J
from sklearn.naive_bayes import GaussianNB2 a1 R7 o# s$ A" ~% t4 T, n
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset7 \) `" k3 ], s% `$ L5 f& G! [
/ u/ i$ `+ V+ `( R, G# \
# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link O; ^1 c2 c2 h9 z
2 L- s# Y. L# z g# Train the model using the training sets and check score 0 z0 D) C+ S2 N, P, [model.fit(X, y)! G0 e. j7 k) [% ~: G! x
# k' g+ l% W2 j5 o
#Predict Output & {" p! p* P1 K& Zpredicted= model.predict(x_test)7 p# n% c1 ?. k& ~3 l1 ~1 F& J* b. Z! {4 P
6.KNN(K-邻近算法)8 r2 Q3 R# D" i3 W. p
这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。 ' s$ @' S( C) F- D, ] A* `; ]* H; W1 {6 b& u
距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。: _. }# D6 g' K- B+ P y
' J/ r% a- Q6 Z$ W# x9 Q1 s
, a( Q5 w2 ?( q6 F! f3 i3 x
$ Q0 y! ]9 o' i" g+ s. f
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。8 p2 r0 L8 b, T
, V; i( b! g" V
在用KNN前你需要考虑到:* h- E+ i$ Q) M, D
1 Q: v1 m/ Y# D# L* H
KNN的计算成本很高 * a, f+ s: l6 f+ l. f/ _. Z( b2 s9 p3 u4 q p" F3 x
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。( p9 K8 d2 ?# ?1 \
+ u) p& `, R9 e, e/ J" |
在进行KNN前预处理数据,例如去除异常值,噪音等。( J* e% O o8 }7 K$ |1 a6 c
9 d2 `" Z- Q( s Q# U#Import Library ( I+ d9 B! X/ W# B2 M, T1 Yfrom sklearn.neighbors import KNeighborsClassifier & q! a5 {6 t/ G7 @: r( O / y9 F1 ^: `1 B& T& q#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 Q% d# T8 H4 k9 w0 Q, E
# Create KNeighbors classifier object model $ q4 Z8 E/ {" o6 Q5 x
3 Y1 l4 ]- E& V/ m) eKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5 7 n7 U% Y+ v! o5 M3 @; J" m4 D! a2 P7 _1 @$ K
# Train the model using the training sets and check score & h3 B o: i vmodel.fit(X, y) 8 y2 c0 P2 E5 W, J- v, H+ h) k 6 w( [- x# A' y( V$ w8 A1 B0 _#Predict Output 8 P% F+ W; C: E" w- m; Npredicted= model.predict(x_test) ' S7 |* ?/ c2 e7 _, I3 P2 t7. K均值算法(K-Means) " d3 ]& |2 l1 a* y4 w5 @这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。7 y2 d: m; K: k" Y; p1 o. O
1 C9 ^2 p) f4 L; S1 h6 D$ ~2 X4 T
还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!! A6 ~/ O' W2 o6 N* l( s
' d2 A+ T& t6 v2 c. Z
: N7 z, h+ r+ ^! M
K均值算法如何划分集群: 0 A' P* x( T+ r; y5 _- M# a# N : t( A% U% x7 j u1 X3 i, b" l # @1 p( r7 r! D9 g$ |! G1 y% e% V! R# I7 ^
从每个集群中选取K个数据点作为质心(centroids)。 " x: _* y9 ]; n2 l$ ]" P % }% ?( ^. O. Y6 U将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。& m3 c4 G% j x( w
, T6 O* F0 @+ f* X$ `) F) p/ G
找出新集群的质心,这样就有了新的质心。 + G9 f) @6 M) ^& }- Y$ g; C; }: ^/ [2 d8 b
重复2和3,直到结果收敛,即不再有新的质心出现。. @& s. M$ ~0 y1 L- J+ Q$ j+ S
; p1 ]$ ~% w/ M. J# D#Import Library5 ~9 F. ^5 ]2 C
from sklearn.cluster import KMeans 3 J. K/ U& `# m" }! E8 {; O- f# G A
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset& ?3 O' k. k- y- N$ A
# Create KNeighbors classifier object model / i9 C3 V0 L# r( q, Y- ?; w/ _
k_means = KMeans(n_clusters=3, random_state=0) & y( G9 y0 @& E$ W, y2 n+ `* _: U8 L: _; U
# Train the model using the training sets and check score # g _6 e. F0 ?2 E' }7 V Fmodel.fit(X) ; F5 z5 E# \/ i2 G0 E9 h8 ~! C* \* w $ I4 X" t3 P2 ], q#Predict Output $ G7 e& A: y/ u& x6 ~predicted= model.predict(x_test). y3 Z* X+ {- L" h. c
8.随机森林4 ~) U1 I9 V' g& W3 l9 z
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。 ( C) b% ^/ R- D, @5 s# | $ g# |1 s# d: a. O怎样生成决策树:' c# M9 ]3 n6 {6 b, B
- H; a& j8 X! N7 k/ i7 n# [( q
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。3 @# n- I. G; E5 |* j5 [2 Z
) ^1 I, i7 i# K0 `. A( ^. B; B; ]
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。 7 q1 i: K N+ z3 a) V$ U5 J O# B/ C# l3 Q: x8 Q% B. L
每个决策树都最大程度上进行分割,没有剪枝。5 y |/ n# \0 H1 u
! u3 ~* [; S0 n& Q4 }) \
#Import Library+ L/ h' j9 C5 V# h0 z
from sklearn.ensemble import RandomForestClassifier ! B: [9 q" p" j1 q; \#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset. ^5 R+ j8 y4 S8 A" H- a
3 f _" S( j+ `# Create Random Forest object! _/ l4 r6 N$ \0 b" N h. F
model= RandomForestClassifier() 0 m0 t: c; \6 ^- r- x+ A' H) v# b1 B+ p* y+ N: _+ d
# Train the model using the training sets and check score # P& N3 ?) u" f; p; }$ l t- m7 Amodel.fit(X, y) . O# w+ q* Y' `6 r) C" I ( W- b& @1 |8 P#Predict Output8 i# A, |! H$ d" m+ Y) o6 y
predicted= model.predict(x_test) # B R+ Q0 t- t9 i& A% |: t9.降维算法(Dimensionality Reduction Algorithms) # p5 ?! l% y7 A) J2 B2 V3 w在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。4 \" a/ U# n( [+ f! O' v
. f2 {0 R/ L) _1 Q5 i0 A例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。7 i8 i- J* m q5 _
6 G4 E5 l& z+ m! P1 `2 H8 V
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。" i. ~8 s! F, C, I' Y1 m
# R. B: g4 H3 |/ @8 D& t: o( N1 s: |0 e- a2 F
#Import Library ! }) g! {+ O; T4 m7 yfrom sklearn import decomposition 3 A. T5 w3 x6 }8 D, ]( x# L#Assumed you have training and test data set as train and test+ o7 P: I& K" i W
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)" m( Y" ?9 U4 B
# For Factor analysis* f! N0 x' j1 X1 X- \& o. y; _
#fa= decomposition.FactorAnalysis() 1 Z- l2 T- c( Q" r; N# Reduced the dimension of training dataset using PCA( M3 E/ A7 ?, u6 m3 {
$ T0 M$ ]( z2 O( V; ]+ }
train_reduced = pca.fit_transform(train)/ ^9 N$ G% Y. t0 }% u" L
1 O( [) X1 K4 v; A5 S* N$ N
#Reduced the dimension of test dataset' J$ `5 t5 ]9 G1 O# ~/ E, s7 j
test_reduced = pca.transform(test) 3 R6 ]( X" f0 F& c10.Gradient Boosing 和 AdaBoost 2 O: c/ z2 {1 T3 f, g+ |GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。 : W' _! Z$ M7 [: }# i" \5 H) m/ q7 Z6 i7 ]# _
#Import Library $ x$ F6 P7 [4 u. y: mfrom sklearn.ensemble import GradientBoostingClassifier' j! u' ~7 V, u
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset; U7 c5 [% c% Q1 N
# Create Gradient Boosting Classifier object % C9 ?3 }" u! s# t4 Hmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0) 5 Y( |- s1 l4 [2 R% G9 P, y! V# M" ?6 {. q% t2 X5 h# P
# Train the model using the training sets and check score) i$ r* b/ i- a" h% a' i
model.fit(X, y)! \/ E6 y& G& e4 u0 n
#Predict Output$ h9 V7 T* t- ]: l* V/ D
predicted= model.predict(x_test) 8 ^- ^/ z" M6 T4 W6 v9 |7 h/ qGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。 0 K7 ?4 k) f9 n# y" ?* x4 ~3 F+ R F. Q
原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386$ f/ _5 ^- x. Q% X2 p' m2 C; a- |
———————————————— ; F* h) x3 @* ]3 `& L版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# h3 d. q1 S6 t6 N$ @: X5 f
原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075 5 d2 M/ _ n5 F4 V+ ]% Z* P. I+ m" Q- { w/ j) Z+ j
l4 j9 i8 q" d# i