1. 常用函數(shù)庫
為蔚縣等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及蔚縣網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站建設、成都網(wǎng)站制作、蔚縣網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
? scipy包中的stats模塊和statsmodels包是python常用的數(shù)據(jù)分析工具,scipy.stats以前有一個models子模塊,后來被移除了。這個模塊被重寫并成為了現(xiàn)在獨立的statsmodels包。
?scipy的stats包含一些比較基本的工具,比如:t檢驗,正態(tài)性檢驗,卡方檢驗之類,statsmodels提供了更為系統(tǒng)的統(tǒng)計模型,包括線性模型,時序分析,還包含數(shù)據(jù)集,做圖工具等等。
2. 小樣本數(shù)據(jù)的正態(tài)性檢驗
(1) 用途
?夏皮羅維爾克檢驗法 (Shapiro-Wilk) 用于檢驗參數(shù)提供的一組小樣本數(shù)據(jù)線是否符合正態(tài)分布,統(tǒng)計量越大則表示數(shù)據(jù)越符合正態(tài)分布,但是在非正態(tài)分布的小樣本數(shù)據(jù)中也經(jīng)常會出現(xiàn)較大的W值。需要查表來估計其概率。由于原假設是其符合正態(tài)分布,所以當P值小于指定顯著水平時表示其不符合正態(tài)分布。
?正態(tài)性檢驗是數(shù)據(jù)分析的第一步,數(shù)據(jù)是否符合正態(tài)性決定了后續(xù)使用不同的分析和預測方法,當數(shù)據(jù)不符合正態(tài)性分布時,我們可以通過不同的轉(zhuǎn)換方法把非正太態(tài)數(shù)據(jù)轉(zhuǎn)換成正態(tài)分布后再使用相應的統(tǒng)計方法進行下一步操作。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果 p-value=0.029035290703177452,比指定的顯著水平(一般為5%)小,則拒絕假設:x不服從正態(tài)分布。
3. 檢驗樣本是否服務某一分布
(1) 用途
?科爾莫戈羅夫檢驗(Kolmogorov-Smirnov test),檢驗樣本數(shù)據(jù)是否服從某一分布,僅適用于連續(xù)分布的檢驗。下例中用它檢驗正態(tài)分布。
(2) 示例
(3) 結(jié)果分析
?生成300個服從N(0,1)標準正態(tài)分布的隨機數(shù),在使用k-s檢驗該數(shù)據(jù)是否服從正態(tài)分布,提出假設:x從正態(tài)分布。最終返回的結(jié)果,p-value=0.9260909172362317,比指定的顯著水平(一般為5%)大,則我們不能拒絕假設:x服從正態(tài)分布。這并不是說x服從正態(tài)分布一定是正確的,而是說沒有充分的證據(jù)證明x不服從正態(tài)分布。因此我們的假設被接受,認為x服從正態(tài)分布。如果p-value小于我們指定的顯著性水平,則我們可以肯定地拒絕提出的假設,認為x肯定不服從正態(tài)分布,這個拒絕是絕對正確的。
4.方差齊性檢驗
(1) 用途
?方差反映了一組數(shù)據(jù)與其平均值的偏離程度,方差齊性檢驗用以檢驗兩組或多組數(shù)據(jù)與其平均值偏離程度是否存在差異,也是很多檢驗和算法的先決條件。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果 p-value=0.19337536323599344, 比指定的顯著水平(假設為5%)大,認為兩組數(shù)據(jù)具有方差齊性。
5. 圖形描述相關性
(1) 用途
?最常用的兩變量相關性分析,是用作圖描述相關性,圖的橫軸是一個變量,縱軸是另一變量,畫散點圖,從圖中可以直觀地看到相關性的方向和強弱,線性正相關一般形成由左下到右上的圖形;負面相關則是從左上到右下的圖形,還有一些非線性相關也能從圖中觀察到。
(2) 示例
(3) 結(jié)果分析
?從圖中可以看到明顯的正相關趨勢。
6. 正態(tài)資料的相關分析
(1) 用途
?皮爾森相關系數(shù)(Pearson correlation coefficient)是反應兩變量之間線性相關程度的統(tǒng)計量,用它來分析正態(tài)分布的兩個連續(xù)型變量之間的相關性。常用于分析自變量之間,以及自變量和因變量之間的相關性。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果的第一個值為相關系數(shù)表示線性相關程度,其取值范圍在[-1,1],絕對值越接近1,說明兩個變量的相關性越強,絕對值越接近0說明兩個變量的相關性越差。當兩個變量完全不相關時相關系數(shù)為0。第二個值為p-value,統(tǒng)計學上,一般當p-value0.05時,可以認為兩變量存在相關性。
7. 非正態(tài)資料的相關分析
(1) 用途
?斯皮爾曼等級相關系數(shù)(Spearman’s correlation coefficient for ranked data ),它主要用于評價順序變量間的線性相關關系,在計算過程中,只考慮變量值的順序(rank, 值或稱等級),而不考慮變量值的大小。常用于計算類型變量的相關性。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果的第一個值為相關系數(shù)表示線性相關程度,本例中correlation趨近于1表示正相關。第二個值為p-value,p-value越小,表示相關程度越顯著。
8. 單樣本T檢驗
(1) 用途
?單樣本T檢驗,用于檢驗數(shù)據(jù)是否來自一致均值的總體,T檢驗主要是以均值為核心的檢驗。注意以下幾種T檢驗都是雙側(cè)T檢驗。
(2) 示例
(3) 結(jié)果分析
?本例中生成了2列100行的數(shù)組,ttest_1samp的第二個參數(shù)是分別對兩列估計的均值,p-value返回結(jié)果,第一列1.47820719e-06比指定的顯著水平(一般為5%)小,認為差異顯著,拒絕假設;第二列2.83088106e-01大于指定顯著水平,不能拒絕假設:服從正態(tài)分布。
9. 兩獨立樣本T檢驗
(1) 用途
?由于比較兩組數(shù)據(jù)是否來自于同一正態(tài)分布的總體。注意:如果要比較的兩組數(shù)據(jù)不滿足方差齊性, 需要在ttest_ind()函數(shù)中添加參數(shù)equal_var = False。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果的第一個值為統(tǒng)計量,第二個值為p-value,pvalue=0.19313343989106416,比指定的顯著水平(一般為5%)大,不能拒絕假設,兩組數(shù)據(jù)來自于同一總結(jié),兩組數(shù)據(jù)之間無差異。
10. 配對樣本T檢驗
(1) 用途
?配對樣本T檢驗可視為單樣本T檢驗的擴展,檢驗的對象由一群來自正態(tài)分布獨立樣本更改為二群配對樣本觀測值之差。它常用于比較同一受試對象處理的前后差異,或者按照某一條件進行兩兩配對分別給與不同處理的受試對象之間是否存在差異。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果的第一個值為統(tǒng)計量,第二個值為p-value,pvalue=0.80964043445811551,比指定的顯著水平(一般為5%)大,不能拒絕假設。
11. 單因素方差分析
(1) 用途
?方差分析(Analysis of Variance,簡稱ANOVA),又稱F檢驗,用于兩個及兩個以上樣本均數(shù)差別的顯著性檢驗。方差分析主要是考慮各組之間的平均數(shù)差別。
?單因素方差分析(One-wayAnova),是檢驗由單一因素影響的多組樣本某因變量的均值是否有顯著差異。
?當因變量Y是數(shù)值型,自變量X是分類值,通常的做法是按X的類別把實例成分幾組,分析Y值在X的不同分組中是否存在差異。
(2) 示例
(3) 結(jié)果分析
?返回結(jié)果的第一個值為統(tǒng)計量,它由組間差異除以組間差異得到,上例中組間差異很大,第二個返回值p-value=6.2231520821576832e-19小于邊界值(一般為0.05),拒絕原假設, 即認為以上三組數(shù)據(jù)存在統(tǒng)計學差異,并不能判斷是哪兩組之間存在差異 。只有兩組數(shù)據(jù)時,效果同 stats.levene 一樣。
12. 多因素方差分析
(1) 用途
?當有兩個或者兩個以上自變量對因變量產(chǎn)生影響時,可以用多因素方差分析的方法來進行分析。它不僅要考慮每個因素的主效應,還要考慮因素之間的交互效應。
(2) 示例
(3) 結(jié)果分析
?上述程序定義了公式,公式中,"~"用于隔離因變量和自變量,”+“用于分隔各個自變量, ":"表示兩個自變量交互影響。從返回結(jié)果的P值可以看出,X1和X2的值組間差異不大,而組合后的T:G的組間有明顯差異。
13. 卡方檢驗
(1) 用途
?上面介紹的T檢驗是參數(shù)檢驗,卡方檢驗是一種非參數(shù)檢驗方法。相對來說,非參數(shù)檢驗對數(shù)據(jù)分布的要求比較寬松,并且也不要求太大數(shù)據(jù)量??ǚ綑z驗是一種對計數(shù)資料的假設檢驗方法,主要是比較理論頻數(shù)和實際頻數(shù)的吻合程度。常用于特征選擇,比如,檢驗男人和女人在是否患有高血壓上有無區(qū)別,如果有區(qū)別,則說明性別與是否患有高血壓有關,在后續(xù)分析時就需要把性別這個分類變量放入模型訓練。
?基本數(shù)據(jù)有R行C列, 故通稱RC列聯(lián)表(contingency table), 簡稱RC表,它是觀測數(shù)據(jù)按兩個或更多屬性(定性變量)分類時所列出的頻數(shù)表。
(2) 示例
(3) 結(jié)果分析
?卡方檢驗函數(shù)的參數(shù)是列聯(lián)表中的頻數(shù),返回結(jié)果第一個值為統(tǒng)計量值,第二個結(jié)果為p-value值,p-value=0.54543425102570975,比指定的顯著水平(一般5%)大,不能拒絕原假設,即相關性不顯著。第三個結(jié)果是自由度,第四個結(jié)果的數(shù)組是列聯(lián)表的期望值分布。
14. 單變量統(tǒng)計分析
(1) 用途
?單變量統(tǒng)計描述是數(shù)據(jù)分析中最簡單的形式,其中被分析的數(shù)據(jù)只包含一個變量,不處理原因或關系。單變量分析的主要目的是通過對數(shù)據(jù)的統(tǒng)計描述了解當前數(shù)據(jù)的基本情況,并找出數(shù)據(jù)的分布模型。
?單變量數(shù)據(jù)統(tǒng)計描述從集中趨勢上看,指標有:均值,中位數(shù),分位數(shù),眾數(shù);從離散程度上看,指標有:極差、四分位數(shù)、方差、標準差、協(xié)方差、變異系數(shù),從分布上看,有偏度,峰度等。需要考慮的還有極大值,極小值(數(shù)值型變量)和頻數(shù),構(gòu)成比(分類或等級變量)。
?此外,還可以用統(tǒng)計圖直觀展示數(shù)據(jù)分布特征,如:柱狀圖、正方圖、箱式圖、頻率多邊形和餅狀圖。
15. 多元線性回歸
(1) 用途
?多元線性回歸模型(multivariable linear regression model ),因變量Y(計量資料)往往受到多個變量X的影響,多元線性回歸模型用于計算各個自變量對因變量的影響程度,可以認為是對多維空間中的點做線性擬合。
(2) 示例
(3) 結(jié)果分析
?直接通過返回結(jié)果中各變量的P值與0.05比較,來判定對應的解釋變量的顯著性,P0.05則認為自變量具有統(tǒng)計學意義,從上例中可以看到收入INCOME最有顯著性。
16. 邏輯回歸
(1) 用途
?當因變量Y為2分類變量(或多分類變量時)可以用相應的logistic回歸分析各個自變量對因變量的影響程度。
(2) 示例
(3) 結(jié)果分析
?直接通過返回結(jié)果中各變量的P值與0.05比較,來判定對應的解釋變量的顯著性,P0.05則認為自變量具有統(tǒng)計學意義。
可以。
使用Python自帶的sum函數(shù),sum函數(shù)是個內(nèi)置函數(shù),可以求一個數(shù)字列表的和,并且可以帶初始值,如果不帶初始值的話,默認是0。
首個參數(shù)為可迭代的列表,初始值默認為0,也可以為其他值,比如說[],空列表在Python里面,類型是動態(tài)類型,一種操作或接口,到底做何操作取決于對象本身比如說同樣是+,如果兩者都是數(shù)字1+1=2,如果兩者都是字符串,則'1'+'1'='11'所以如果這里的start本身為[],則會執(zhí)行列表合并的操作。
from scipy.optimize import fmin
def myfunc(x):
return x**2-4*x+8
print fmin(myfunc, 0)
def myfunc(p):
x, y = p
return x**2+y**2+8
print fmin(myfunc, (1, 1))
復制代碼
fmin的第一個參數(shù)是一個函數(shù),這個函數(shù)的參數(shù)是一個數(shù)組,數(shù)組中每個元素是一個變量,因此對于多元函數(shù),需要在myfunc內(nèi)部將數(shù)組的內(nèi)容展開。
一、概觀scipy中的optimize子包中提供了常用的最優(yōu)化算法函數(shù)實現(xiàn)。我們可以直接調(diào)用這些函數(shù)完成我們的優(yōu)化問題。optimize中函數(shù)最典型的特點就是能夠從函數(shù)名稱上看出是使用了什么算法。下面optimize包中函數(shù)的概覽:1.非線性最優(yōu)化fmin -- 簡單Nelder-Mead算法fmin_powell -- 改進型Powell法fmin_bfgs -- 擬Newton法fmin_cg -- 非線性共軛梯度法fmin_ncg -- 線性搜索Newton共軛梯度法leastsq -- 最小二乘2.有約束的多元函數(shù)問題fmin_l_bfgs_b ---使用L-BFGS-B算法fmin_tnc ---梯度信息fmin_cobyla ---線性逼近fmin_slsqp ---序列最小二乘法nnls ---解|| Ax - b ||_2 for x=03.全局優(yōu)化anneal ---模擬退火算法brute --強力法4.標量函數(shù)fminboundbrentgoldenbracket5.擬合curve_fit-- 使用非線性最小二乘法擬合6.標量函數(shù)求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個算法的人名bisect ---二分法newton ---牛頓法fixed_point7.多維函數(shù)求根fsolve ---通用broyden1 ---Broyden’s first Jacobian approximation.broyden2 ---Broyden’s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixingexcitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.實用函數(shù)line_search ---找到滿足強Wolfe的alpha值check_grad ---通過和前向有限差分逼近比較檢查梯度函數(shù)的正確性二、實戰(zhàn)非線性最優(yōu)化fmin完整的調(diào)用形式是:fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過我們最常使用的就是前兩個參數(shù)。一個描述優(yōu)化問題的函數(shù)以及初值。后面的那些參數(shù)我們也很容易理解。如果您能用到,請自己研究。下面研究一個最簡單的問題,來感受這個函數(shù)的使用方法:f(x)=x**2-4*x+8,我們知道,這個函數(shù)的最小值是4,在x=2的時候取到。from scipy.optimize import fmin #引入優(yōu)化包def myfunc(x):return x**2-4*x+8 #定義函數(shù)x0 = [1.3] #猜一個初值xopt = fmin(myfunc, x0) #求解print xopt #打印結(jié)果運行之后,給出的結(jié)果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]程序準確的計算得出了最小值,不過最小值點并不是嚴格的2,這應該是由二進制機器編碼誤差造成的。除了fmin_ncg必須提供梯度信息外,其他幾個函數(shù)的調(diào)用大同小異,完全類似。我們不妨做一個對比:from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):return x**2-4*x+8x0 = [1.3]xopt1 = fmin(myfunc, x0)print xopt1printxopt2 = fmin_powell(myfunc, x0)print xopt2printxopt3 = fmin_bfgs(myfunc, x0)print xopt3printxopt4 = fmin_cg(myfunc,x0)print xopt4給出的結(jié)果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 531.99999999997Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 12Gradient evaluations: 4[ 2.00000001]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 15Gradient evaluations: 5[ 2.]我們可以根據(jù)給出的消息直觀的判斷算法的執(zhí)行情況。每一種算法數(shù)學上的問題,請自己看書學習。個人感覺,如果不是純研究數(shù)學的工作,沒必要搞清楚那些推導以及定理云云。不過,必須了解每一種算法的優(yōu)劣以及能力所及。在使用的時候,不妨多種算法都使用一下,看看效果分別如何,同時,還可以互相印證算法失效的問題。在from scipy.optimize import fmin之后,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數(shù)的含義說明,這是調(diào)用函數(shù)時候的最有價值參考。有源碼研究癖好的,或者當你需要改進這些已經(jīng)實現(xiàn)的算法的時候,可能需要查看optimize中的每種算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發(fā)現(xiàn)了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!
1、什么是多元線性回歸模型?
當y值的影響因素不唯一時,采用多元線性回歸模型。
y =y=β0+β1x1+β2x2+...+βnxn
例如商品的銷售額可能不電視廣告投入,收音機廣告投入,報紙廣告投入有關系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
2、使用pandas來讀取數(shù)據(jù)
pandas 是一個用于數(shù)據(jù)探索、數(shù)據(jù)分析和數(shù)據(jù)處理的python庫
[python]?view plain?copy
import?pandas?as?pd
[html]?view plain?copy
pre?name="code"?class="python"#?read?csv?file?directly?from?a?URL?and?save?the?results
data?=?pd.read_csv('/home/lulei/Advertising.csv')
#?display?the?first?5?rows
data.head()
上面代碼的運行結(jié)果:
TV ?Radio ?Newspaper ?Sales
0 ?230.1 ? 37.8 ? ? ? 69.2 ? 22.1
1 ? 44.5 ? 39.3 ? ? ? 45.1 ? 10.4
2 ? 17.2 ? 45.9 ? ? ? 69.3 ? ?9.3
3 ?151.5 ? 41.3 ? ? ? 58.5 ? 18.5
4 ?180.8 ? 10.8 ? ? ? 58.4 ? 12.9
上面顯示的結(jié)果類似一個電子表格,這個結(jié)構(gòu)稱為Pandas的數(shù)據(jù)幀(data frame),類型全稱:pandas.core.frame.DataFrame.
pandas的兩個主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame:
Series類似于一維數(shù)組,它有一組數(shù)據(jù)以及一組與之相關的數(shù)據(jù)標簽(即索引)組成。
DataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典。
[python]?view plain?copy
#?display?the?last?5?rows
data.tail()
只顯示結(jié)果的末尾5行
?TV ?Radio ?Newspaper ?Sales
195 ? 38.2 ? ?3.7 ? ? ? 13.8 ? ?7.6
196 ? 94.2 ? ?4.9 ? ? ? ?8.1 ? ?9.7
197 ?177.0 ? ?9.3 ? ? ? ?6.4 ? 12.8
198 ?283.6 ? 42.0 ? ? ? 66.2 ? 25.5
199 ?232.1 ? ?8.6 ? ? ? ?8.7 ? 13.4
[html]?view plain?copy
#?check?the?shape?of?the?DataFrame(rows,?colums)
data.shape
查看DataFrame的形狀,注意第一列的叫索引,和數(shù)據(jù)庫某個表中的第一列類似。
(200,4)?
3、分析數(shù)據(jù)
特征:
TV:對于一個給定市場中單一產(chǎn)品,用于電視上的廣告費用(以千為單位)
Radio:在廣播媒體上投資的廣告費用
Newspaper:用于報紙媒體的廣告費用
響應:
Sales:對應產(chǎn)品的銷量
在這個案例中,我們通過不同的廣告投入,預測產(chǎn)品銷量。因為響應變量是一個連續(xù)的值,所以這個問題是一個回歸問題。數(shù)據(jù)集一共有200個觀測值,每一組觀測對應一個市場的情況。
注意:這里推薦使用的是seaborn包。網(wǎng)上說這個包的數(shù)據(jù)可視化效果比較好看。其實seaborn也應該屬于matplotlib的內(nèi)部包。只是需要再次的單獨安裝。
[python]?view plain?copy
import?seaborn?as?sns
import?matplotlib.pyplot?as?plt
#?visualize?the?relationship?between?the?features?and?the?response?using?scatterplots
sns.pairplot(data,?x_vars=['TV','Radio','Newspaper'],?y_vars='Sales',?size=7,?aspect=0.8)
plt.show()#注意必須加上這一句,否則無法顯示。
[html]?view plain?copy
這里選擇TV、Radio、Newspaper?作為特征,Sales作為觀測值
[html]?view plain?copy
返回的結(jié)果:
seaborn的pairplot函數(shù)繪制X的每一維度和對應Y的散點圖。通過設置size和aspect參數(shù)來調(diào)節(jié)顯示的大小和比例??梢詮膱D中看出,TV特征和銷量是有比較強的線性關系的,而Radio和Sales線性關系弱一些,Newspaper和Sales線性關系更弱。通過加入一個參數(shù)kind='reg',seaborn可以添加一條最佳擬合直線和95%的置信帶。
[python]?view plain?copy
sns.pairplot(data,?x_vars=['TV','Radio','Newspaper'],?y_vars='Sales',?size=7,?aspect=0.8,?kind='reg')
plt.show()
結(jié)果顯示如下:
4、線性回歸模型
優(yōu)點:快速;沒有調(diào)節(jié)參數(shù);可輕易解釋;可理解。
缺點:相比其他復雜一些的模型,其預測準確率不是太高,因為它假設特征和響應之間存在確定的線性關系,這種假設對于非線性的關系,線性回歸模型顯然不能很好的對這種數(shù)據(jù)建模。
線性模型表達式:?y=β0+β1x1+β2x2+...+βnxn?其中
y是響應
β0是截距
β1是x1的系數(shù),以此類推
在這個案例中:?y=β0+β1?TV+β2?Radio+...+βn?Newspaper
(1)、使用pandas來構(gòu)建X(特征向量)和y(標簽列)
scikit-learn要求X是一個特征矩陣,y是一個NumPy向量。
pandas構(gòu)建在NumPy之上。
因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解這種結(jié)構(gòu)。
[python]?view plain?copy
#create?a?python?list?of?feature?names
feature_cols?=?['TV',?'Radio',?'Newspaper']
#?use?the?list?to?select?a?subset?of?the?original?DataFrame
X?=?data[feature_cols]
#?equivalent?command?to?do?this?in?one?line
X?=?data[['TV',?'Radio',?'Newspaper']]
#?print?the?first?5?rows
print?X.head()
#?check?the?type?and?shape?of?X
print?type(X)
print?X.shape
輸出結(jié)果如下:
TV ?Radio ?Newspaper
0 ?230.1 ? 37.8 ? ? ? 69.2
1 ? 44.5 ? 39.3 ? ? ? 45.1
2 ? 17.2 ? 45.9 ? ? ? 69.3
3 ?151.5 ? 41.3 ? ? ? 58.5
4 ?180.8 ? 10.8 ? ? ? 58.4
class 'pandas.core.frame.DataFrame'
(200, 3)
[python]?view plain?copy
#?select?a?Series?from?the?DataFrame
y?=?data['Sales']
#?equivalent?command?that?works?if?there?are?no?spaces?in?the?column?name
y?=?data.Sales
#?print?the?first?5?values
print?y.head()
輸出的結(jié)果如下:
0 ? ?22.1
1 ? ?10.4
2 ? ? 9.3
3 ? ?18.5
4 ? ?12.9
Name: Sales
(2)、構(gòu)建訓練集與測試集
[html]?view plain?copy
pre?name="code"?class="python"span?style="font-size:14px;"##構(gòu)造訓練集和測試集
from?sklearn.cross_validation?import?train_test_split??#這里是引用了交叉驗證
X_train,X_test,?y_train,?y_test?=?train_test_split(X,?y,?random_state=1)
#default split is 75% for training and 25% for testing
[html]?view plain?copy
print?X_train.shape
print?y_train.shape
print?X_test.shape
print?y_test.shape
輸出結(jié)果如下:
(150, 3)
(150,)
(50, 3)
(50,)
注:上面的結(jié)果是由train_test_spilit()得到的,但是我不知道為什么我的版本的sklearn包中居然報錯:
ImportError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)ipython-input-182-3eee51fcba5a in module() ? ? ?1 ###構(gòu)造訓練集和測試集---- 2 from sklearn.cross_validation import train_test_split ? ? ?3 #import sklearn.cross_validation ? ? ?4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) ? ? ?5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split
處理方法:1、我后來重新安裝sklearn包。再一次調(diào)用時就沒有錯誤了。
2、自己寫函數(shù)來認為的隨機構(gòu)造訓練集和測試集。(這個代碼我會在最后附上。)
(3)sklearn的線性回歸
[html]?view plain?copy
from?sklearn.linear_model?import?LinearRegression
linreg?=?LinearRegression()
model=linreg.fit(X_train,?y_train)
print?model
print?linreg.intercept_
print?linreg.coef_
輸出的結(jié)果如下:
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
2.66816623043
[ 0.04641001 ?0.19272538 -0.00349015]
[html]?view plain?copy
#?pair?the?feature?names?with?the?coefficients
zip(feature_cols,?linreg.coef_)
輸出如下:
[('TV', 0.046410010869663267),
('Radio', 0.19272538367491721),
('Newspaper', -0.0034901506098328305)]
y=2.668+0.0464?TV+0.192?Radio-0.00349?Newspaper
如何解釋各個特征對應的系數(shù)的意義?
對于給定了Radio和Newspaper的廣告投入,如果在TV廣告上每多投入1個單位,對應銷量將增加0.0466個單位。就是加入其它兩個媒體投入固定,在TV廣告上每增加1000美元(因為單位是1000美元),銷量將增加46.6(因為單位是1000)。但是大家注意這里的newspaper的系數(shù)居然是負數(shù),所以我們可以考慮不使用newspaper這個特征。這是后話,后面會提到的。
(4)、預測
[python]?view plain?copy
y_pred?=?linreg.predict(X_test)
print?y_pred
[python]?view plain?copy
print?type(y_pred)
輸出結(jié)果如下:
[ 14.58678373 ? 7.92397999 ?16.9497993 ? 19.35791038 ? 7.36360284
7.35359269 ?16.08342325 ? 9.16533046 ?20.35507374 ?12.63160058
22.83356472 ? 9.66291461 ? 4.18055603 ?13.70368584 ?11.4533557
4.16940565 ?10.31271413 ?23.06786868 ?17.80464565 ?14.53070132
15.19656684 ?14.22969609 ? 7.54691167 ?13.47210324 ?15.00625898
19.28532444 ?20.7319878 ? 19.70408833 ?18.21640853 ? 8.50112687
9.8493781 ? ?9.51425763 ? 9.73270043 ?18.13782015 ?15.41731544
5.07416787 ?12.20575251 ?14.05507493 ?10.6699926 ? ?7.16006245
11.80728836 ?24.79748121 ?10.40809168 ?24.05228404 ?18.44737314
20.80572631 ? 9.45424805 ?17.00481708 ? 5.78634105 ? 5.10594849]
type 'numpy.ndarray'
5、回歸問題的評價測度
(1) 評價測度
對于分類問題,評價測度是準確率,但這種方法不適用于回歸問題。我們使用針對連續(xù)數(shù)值的評價測度(evaluation metrics)。
這里介紹3種常用的針對線性回歸的測度。
1)平均絕對誤差(Mean Absolute Error, MAE)
(2)均方誤差(Mean Squared Error, MSE)
(3)均方根誤差(Root Mean Squared Error, RMSE)
這里我使用RMES。
[python]?view plain?copy
pre?name="code"?class="python"#計算Sales預測的RMSE
print?type(y_pred),type(y_test)
print?len(y_pred),len(y_test)
print?y_pred.shape,y_test.shape
from?sklearn?import?metrics
import?numpy?as?np
sum_mean=0
for?i?in?range(len(y_pred)):
sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_erro=np.sqrt(sum_mean/50)
#?calculate?RMSE?by?hand
print?"RMSE?by?hand:",sum_erro
最后的結(jié)果如下:
type 'numpy.ndarray' class 'pandas.core.series.Series'
50 50
(50,) (50,)
RMSE by hand: 1.42998147691
(2)做ROC曲線
[python]?view plain?copy
import?matplotlib.pyplot?as?plt
plt.figure()
plt.plot(range(len(y_pred)),y_pred,'b',label="predict")
plt.plot(range(len(y_pred)),y_test,'r',label="test")
plt.legend(loc="upper?right")?#顯示圖中的標簽
plt.xlabel("the?number?of?sales")
plt.ylabel('value?of?sales')
plt.show()
顯示結(jié)果如下:(紅色的線是真實的值曲線,藍色的是預測值曲線)
直到這里整個的一次多元線性回歸的預測就結(jié)束了。
6、改進特征的選擇
在之前展示的數(shù)據(jù)中,我們看到Newspaper和銷量之間的線性關系竟是負關系(不用驚訝,這是隨機特征抽樣的結(jié)果。換一批抽樣的數(shù)據(jù)就可能為正了),現(xiàn)在我們移除這個特征,看看線性回歸預測的結(jié)果的RMSE如何?
依然使用我上面的代碼,但只需修改下面代碼中的一句即可:
[python]?view plain?copy
#create?a?python?list?of?feature?names
feature_cols?=?['TV',?'Radio',?'Newspaper']
#?use?the?list?to?select?a?subset?of?the?original?DataFrame
X?=?data[feature_cols]
#?equivalent?command?to?do?this?in?one?line
#X?=?data[['TV',?'Radio',?'Newspaper']]#只需修改這里即可pre?name="code"?class="python"?style="font-size:?15px;?line-height:?35px;"X?=?data[['TV',?'Radio']]??#去掉newspaper其他的代碼不變
# print the first 5 rowsprint X.head()# check the type and shape of Xprint type(X)print X.shape
最后的到的系數(shù)與測度如下:
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
2.81843904823
[ 0.04588771 ?0.18721008]
RMSE by hand: 1.28208957507
然后再次使用ROC曲線來觀測曲線的整體情況。我們在將Newspaper這個特征移除之后,得到RMSE變小了,說明Newspaper特征可能不適合作為預測銷量的特征,于是,我們得到了新的模型。我們還可以通過不同的特征組合得到新的模型,看看最終的誤差是如何的。
備注:
之前我提到了這種錯誤:
注:上面的結(jié)果是由train_test_spilit()得到的,但是我不知道為什么我的版本的sklearn包中居然報錯:
ImportError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)ipython-input-182-3eee51fcba5a in module() ? ? ?1 ###構(gòu)造訓練集和測試集---- 2 from sklearn.cross_validation import train_test_split ? ? ?3 #import sklearn.cross_validation ? ? ?4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) ? ? ?5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split
處理方法:1、我后來重新安裝sklearn包。再一次調(diào)用時就沒有錯誤了。
2、自己寫函數(shù)來認為的隨機構(gòu)造訓練集和測試集。(這個代碼我會在最后附上。)
這里我給出我自己寫的函數(shù):
SciPy 里面的子函數(shù)庫optimize, 一般情況下可用curve_fit函數(shù)直接擬合或者leastsq做最小二乘