環境仍然是Jupyter Notebook, py2.7,至今沒發現拿python做數據分析,有比這個筆記本更好用的工具。
此篇文章呢,主要是通過一個小的機器學習的項目,來說明一下,相關的大概步驟和所涉及到各種概念。
原始數據:有如下特點
波士頓房屋這些數據於1978年開始統計,共506個數據點,涵蓋了麻省波士頓不同郊區房屋14種特征的信息。本項目對原始數據集做了以下處理:
1,異常的點的清除
2,無關特征的清除
數據操作這塊主要通過Numpy和Pandas
數據展示這塊主要是matplotlib和后台自定義的包visuals(仍然是基於matplotlib)
第一步操作,就是在讀入housing.csv文件后,統計一下價格的最小值、最大值、均值、中值和標准差,后期做數據分析的時候,其實用到這幾個統計值。
這里實現呢,本身python是自帶統計函數的,但是,這里使用numpy相關的函數處理,理論上速度應該更快一些。
可以這樣認為,numpy包是基於python做的優化,而pandas是基於numpy做的優化。
其他數據特征含義,可參考下圖:

第二步操作,開始建模准備
選用R^2, 也就是決定系數作為模型的評測函數,一看這意思,就是要用回歸分析來進行預測啦,因為決定系數,就是回歸分析中最經常用的評價指標,
比如,回歸系數是否顯著,調整后的R平方(調整后的R2平方,及調整后的決定系數,若R2平方為)0.60,可解釋為自變量的變異解釋了因變量變異的60%,R2平方取值范圍為0-1,越大代表回歸方程對因變量的解釋程度越大)
R^2的0表示從變量不能預測因變量.
R^2的1表示從自變量可以無誤差地預測因變量。
所謂的擬合程度,就是指模型本身預測的准確程度,欠擬合,說明預測的太爛,過擬合,說明模型本身對數據太敏感,只是在訓練數據上得分高,但是一旦超過那個數據的范圍,使用新數據的話,預測准確性就會往下掉。
第三步,做數據切割
主要目的就是為了分為訓練數據和測試數據,主要是用到了sklearn中model_selection這個包,然后用到train_test_split,
這個方法主要目的,就是隨機生成的參數都比較好理解,
只是,random_state這個參數需要認真學習一下,這個東東叫隨機數種子,我們做一個小測試,下面我們在使用train_test_split方法的時候設置這個參數,比如設置為0,當然也可以設置成1,2或者其他整數。

大家看到每次在進行分割的時候,他所分成的數組的結構是一樣的。那么如果我不設置這個參數呢,

所以,當你相重復你之前的分割組的時候,你需要設置 random_state,不然它就會隨機生成其他的數組結構,不一樣的數組結構可能就會引發新的問題。所以舍不設置這個參數主要看你的需求。
把數據分割成訓練集和測試集的目的,提升模型的泛化能力是一個目的。泛化能力,跟剛才的過擬合有點觀點,就是希望模型本身能同樣對新數據有較高的預測能力。
第四步,通過學習曲線和驗證曲線來分析模型的來對算法進行診斷
下面是不同深度的決策樹回歸算法生成的學習曲線:

學習曲線是用來干嘛的?書上說它是用來判斷算法究竟是過擬合還是欠擬合,
過擬合前面提到過,對數據本身依賴行過強,泛化能力較差。可以認為是模型的問題,可能就是模型本身太復雜(相對於訓練集),參數太多。
一般說這種模型偏差較高,解決方法是增大訓練集,但現實一般不容易做到。
欠擬合是說模型預測的能力太差,評測函數打的分太低,這有可能是數據本身比較復雜,但模型比較簡單造成的
一般說這種模型偏差較高,解決方法是構建更多特征,減少正則項。
上面四個圖中,從max-depth=6 開始,方差就增大了。而max-depth=1,很顯然偏差比較大。
怎么解決呢?或者說怎么找最佳的深度值呢?通過驗證曲線:下圖

驗證曲線,主要展示的是不同深度所對應的分數,這里的分數仍然是決定系數。通過觀察,可以發覺在深度為3的時候應該是個最佳點。這個max-depth也可以認為是最優參數
(未完待續)
,
