' q1 u* x) I- @4 a; v& j# q- F Y=因变量4 e6 C' F x$ `
$ F+ n! c; n: v# P a =斜率2 _% \- b0 z9 b0 K! ^0 J' S& D
* L g( H$ ^' F x=自变量 e3 N6 G/ Z. _8 x- C
! z. L0 m* I$ o! k7 p b=截距. Y7 h' k6 J+ A$ a4 a
( c1 D* e. {! o. D
a和b可以通过最下化因变量误差的平方和得到(最小二乘法) [4 t/ ]( K3 P' I1 j f
1 C+ B, W& m: f1 b3 A: r: R
我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。! d( l% W) r r& t6 l2 T7 `/ l
$ _, c+ z" v! a假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。/ h% {& q: T1 g* t1 B# [! n/ z
9 O* e: r. ^) |" e0 D
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧% q8 P( s3 {/ U `, w
0 ~! v k$ _; ^% j4 e3 Q1 Z
最终事件的预测变量的线性组合就是:) I- ?4 h, I( B
, W. ~: `) Z: d9 l3 V7 w
4 [2 D3 M6 F4 }' h: w
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence c! b. v! P, S5 A
2 R/ M. u1 O. v& f0 _( X( E6 i
ln(odds) = ln(p/(1-p)) + H8 }+ E2 W/ d( h 0 f% y8 D5 d, Slogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk $ ?4 j- z! Q4 A在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和. ' b/ V$ x( q: X5 L 3 G/ F8 f% Y T6 U; \- H% h1 T至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.# a7 A$ i M4 A8 P& C4 n
7 U' s& X1 z0 K* { ' ^2 L( z3 Z0 V9 e % G+ [; G3 f7 W/ ~2 V0 H$ C9 @ from sklearn.linear_model import LogisticRegression% S% l7 q4 m1 f
) S& j- H7 b* H$ }3 p
model = LogisticRegression() , A. j, D: N( U% N" J% [+ O3 ]: P# }4 K$ L5 |- N0 q# W6 F
# Train the model using the training sets and check score 2 g0 t' D6 H% j; i7 o model.fit(X, y)) b$ C. b, Y! [& |! b3 Q4 h
model.score(X, y) 0 f5 T z( }) p) n4 @3 y5 v( R9 s
#Equation coefficient and Intercept. ^& i. c# e# S
print('Coefficient: \n', model.coef_)2 o, L1 q( ?- R; d. w
print('Intercept: \n', model.intercept_)" Q" {& G' ~+ b: x# L& w
* B! \, T& ?$ F( X A$ S2 K #Predict Output 0 }% v# ~" k: i! M predicted= model.predict(x_test) ' j+ k* L- B* t2 h P逻辑回归的优化: ' |6 P; n( E& ^. H( P加入交互项. }) S% X/ b, J. |- k
$ A2 {; h( B% b3 t+ s 减少特征变量& h! n( J! L U5 E3 J
. [, c& r& P. O1 |$ s 正则化- C6 U" A7 R. K1 v) X
% c9 w1 v& ?. o! C# n 使用非线性模型 / C2 d8 c9 O7 D, O- `* c k+ ^ . M$ F `* H% P( s3 z0 z3.决策树; S! P% e) L z/ w- s/ v. G$ a
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。 / T5 {" f4 D( H: G& z: d$ q; Y \1 |# x, G * V. i+ d, N3 o& S, K- L) Y - t6 _) U& t7 U' H' {; d' q! w) J( B* b: r1 V+ u! Q2 M5 |
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。 0 |0 R6 D0 i1 f/ P 0 `- a* F. C5 x: [: G+ h6 j8 V2 Z / b- `. k1 s1 u- k( z' `" e3 `from sklearn import tree . D5 H( |, u. b6 T% t; M% |* [+ Y/ P b
7 }0 I+ r% |0 d! ?0 {
# Create tree object ; @4 K5 h' M; F. m+ ^6 z
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini + m1 A! N. K; q X/ w U
$ H8 x! Y* U6 [4 Q$ y; B# model = tree.DecisionTreeRegressor() for regression 5 N2 m6 {" t7 P6 \: g* v + w k% Q+ v3 ~, ^' X5 r V# Train the model using the training sets and check score h+ c3 ?! k Z+ y2 Ymodel.fit(X, y) ) K5 V3 B; t. G- v I" Q" \model.score(X, y) & C" s$ q1 @% ^5 O6 z! W* b/ ^ 8 H# k3 ?: l9 {' q# }#Predict Output - g, Q' ], w9 q4 Gpredicted= model.predict(x_test)* x: X" v7 L, q/ C+ _
4. 支持向量机(SVM) ) S5 t E+ b' o$ x' x这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。 ' ^, H( t. H& H2 B( l ' Y: y0 n) J0 f2 k l7 ~% d0 ?现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。& V6 b% }7 W- b, Y0 K* l
) p8 ~: H% l& s G/ u
7 V! @& S- K: q8 J, U) T/ D
/ E* v5 n& a/ \! q
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。2 H5 n) W+ I" r, I/ v, ]
0 b" z8 |, l0 T L: N3 |
#Import Library + |% f- K, _3 n$ efrom sklearn import svm . T; [ u; n( L. i# @#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 R5 F0 [# J8 m8 `. S4 S
# Create SVM classification object , Z. z: X9 W" |! y7 \) ~
' ~, L! l T+ t# w; p
model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.2 j* B4 f2 M+ o. b; r
) M- P* E: D) n* @ A
# Train the model using the training sets and check score- Z3 z B6 D$ g7 d
model.fit(X, y) ' e, y) f: u; t& P# v( |model.score(X, y)- X; U/ ^5 Y; }) q7 j$ r
0 R4 a% k' D: x' T, t g, J将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。4 m3 V- j8 D s$ U
. |; H4 p7 O: [" b7 h找出新集群的质心,这样就有了新的质心。 9 s- @: b6 z" d! p' B4 F& N0 N8 D* R 0 e* m# w2 m; e; m7 O4 a重复2和3,直到结果收敛,即不再有新的质心出现。" U" ]" Y% F2 z
; M* S9 V, K2 f0 B; |4 a- f0 w
, ]/ M5 B# ~1 Y y
怎样确定K的值:) A3 [: Y0 O# _6 X2 J
$ D) o5 L# U$ B* h8 `7 z
如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。/ O" `' T- h1 ~
2 p0 R! x0 j* d( x0 g( B z
我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。9 \4 S5 p Q5 l4 N* _4 s1 F/ r
+ Y, l6 ]# }$ A% a - P9 a2 o% P" k1 z#Import Library * E4 C; k( P( O+ c' q0 ?: _" k5 o% tfrom sklearn.cluster import KMeans' }& a4 ~' Q p" C3 l2 _, I
0 Q) W5 q3 g& c: L2 H
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset , C J w, r& _* L' o- H2 n# s# Create KNeighbors classifier object model 8 Y1 w8 n* r2 L2 ^k_means = KMeans(n_clusters=3, random_state=0)" D! _: ]1 X5 z
& }8 S# ?; q1 l: D C# Train the model using the training sets and check score : p) U# |/ ]8 {7 [& j% }1 ymodel.fit(X) 8 f, H5 }# L1 g- b2 i+ u # s+ a7 S @7 ]- k) W. W#Predict Output8 Y* y8 [6 M# X
predicted= model.predict(x_test) % m5 {* j# }- b" n% A1 ^# h$ W8.随机森林, T$ c/ x1 D+ [$ C: q+ T8 }
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。4 v/ ]4 k9 W E- t4 e2 |) {' C! ]; H+ B
- m; E* m4 S" Q0 B怎样生成决策树: ( ~) M' C0 W f; F& g, N: x8 d6 w7 U' S+ N$ X
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。$ g# b0 U4 I H6 W4 W+ I7 e, e$ t
i) N* [8 Q% N
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。 & `( B5 \ }+ M2 X9 o4 W4 N6 I2 F, T" V8 q: ?9 n
每个决策树都最大程度上进行分割,没有剪枝。 - G6 ?7 x( H$ D% n6 y 7 z g6 s. q, A( M" `4 a0 F/ U8 v6 e#Import Library* u+ a' E" v& I7 v
from sklearn.ensemble import RandomForestClassifier " X7 ~: m. h* M3 k- r#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset3 W! S# D9 u* S. _+ {
# l O- V. _2 c4 _
# Create Random Forest object 0 v* y/ N2 q i1 mmodel= RandomForestClassifier() 9 }: K5 M3 H2 V- b0 ]7 W. r ) N' u0 q# I* _7 ]! v$ f6 t# Train the model using the training sets and check score5 u/ L+ |. k# w4 c5 ?- M) D
model.fit(X, y) ( g& Q7 Y3 t( }* Z# f9 R 5 t4 V1 Y7 d* Q! j#Predict Output ' s; J2 F2 P' Opredicted= model.predict(x_test) 6 ~+ e- s, o3 M9 A9 P; S( i9.降维算法(Dimensionality Reduction Algorithms)- x4 P9 M# w1 r0 L4 V( ^+ L
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。2 F; N; E4 D+ W5 Z
! U0 p. s& D4 h6 X
例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。 6 W* y( _" |# }% J6 O w6 Q, K' \" i+ {( W* J# k
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。- \4 M+ \$ M2 T, z3 G
' L1 v! V* j" h: R
0 x; K6 ~2 s' R) @
#Import Library : i& B/ I: t" z+ h# qfrom sklearn import decomposition ( Y t3 K& x4 _3 u#Assumed you have training and test data set as train and test . ~) ]2 w% d. y9 B! \. }; q3 y, |$ ?# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) 5 g- M" z N j# {6 L7 ]. A# For Factor analysis 5 P# U8 t* J7 w5 x#fa= decomposition.FactorAnalysis() b) S& w" l# R1 E% A5 V/ C
# Reduced the dimension of training dataset using PCA 8 r9 e" O8 @! V2 C . H. D l$ z3 v* D$ k% Vtrain_reduced = pca.fit_transform(train)9 Q+ {6 j# J, I! m! x0 v" g
, r" g6 U0 s% N3 _, w
#Reduced the dimension of test dataset0 B9 N7 ^' n) i
test_reduced = pca.transform(test) & u2 T% F9 y5 i; H: P10.Gradient Boosing 和 AdaBoost & c1 k( ]) @8 J: p* P# g1 pGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。 * N! o L d! K! N, h 5 V+ s$ z' ^0 ^5 } B4 \#Import Library 6 f7 b1 L Z$ ]from sklearn.ensemble import GradientBoostingClassifier ( c: S8 _4 ]0 K: W# k2 z#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset: e, u, b* N) L2 I$ {! F
# Create Gradient Boosting Classifier object) L5 A1 B$ ?, O2 t* @: ?1 j
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)' r b6 `5 ]% _, b; u6 ~& f
/ V1 d" q$ i4 [8 w* I# Train the model using the training sets and check score + g% `) C& B2 Q! ?+ z! T4 Y; {model.fit(X, y)0 t' m1 E1 g$ K/ _6 d
#Predict Output9 n0 s% j# t& o
predicted= model.predict(x_test)1 K$ m) I) Q/ d4 l" l/ c4 T
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。 9 q& E( s1 j* }3 N2 N' w3 b5 p( ]3 ~. b
原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386; d- x! z- W# L; U7 p; f3 o
————————————————$ o+ ~ \3 H; e2 Q
版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 |" K/ H' Q6 r; ~
原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075 % h- N& ~, `- ?! X* m2 Z& c1 W. y- c' y" b* i