機器學習常用的分類器比較-例項
這篇學習文章是在上一篇部落格(http://blog.csdn.net/july_sun/article/details/53088673)的基礎上,從機器學習的四要素(資料,演算法和模型,計算機硬體,機器學習平臺)角度出發用例項將各個分類器做一比較,下面就開始這段程式碼的奇妙旅程吧~~
第一:計算機硬體
本例中只要普通的64位 win系統即可,使用的python是W64的Anaconda,這個python平臺的好處是已安裝好經常使用的ML包,如sklearn和資料處理包,如numpy和scipy.
第二:機器學習平臺
首先,本例中用到了資料處理包numpy對資料進行預處理,當然也可以直接使用scipy包,如果呼叫scipy就可以直接使用numpy,因為scipy是基於numpy的.
其次,在機器學習模型訓練和引數選擇時使用萬能的sklearn庫,裡面包含了機器學習的最廣泛使用的演算法
第三:資料
step1:資料收集
網上有大量的免費資料和文字可以拿來使用,也可以自己簡單生成或者是用sklearn的datasets的資料集,亦或是sklearn的make_regression來生成純資料以及帶有噪聲的資料,本例中使用的是中國氣象資料網2015年的上海的氣象資料來讓計算機學習上海這一年中的氣溫和一些因素的關係,即監督學習,其中Y是氣溫.
程式碼如下:
import numpy as np W = ['C:\\Users\\123\\Desktop\\weather\\2015.txt',] weather = np. loadtxt ( W [0] , skiprows =1) weather[: ,7 ] = weather[: ,7 ] / 10plt . figure () plt . axis ([0 , 370 , -5, 40]) plt . ylabel (" Temperatures" ) plt . xlabel (" Month" ) plt . xticks ([30 , 58, 89, 119 , 150 , 180 ,211 , 242 , 272 , 303 , 333 , 364], ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] ) plt . title (' Temperatures trent chart of Shanghai in year 2015 ') plt . plot ( np.arange(len(weather)),weather[: , 7 ],label=2015,marker='*',linestyle='-',color="black") plt . legend() plt . show()
視覺化如下:
step2:資料清洗
首先要看一下資料是否是完整的,如果不完整(可能缺失或者不對齊等)就需要清洗資料,這一步對後續模型的選擇以及結果很重要,因為這篇文章重點在機器學習分類器的比較,所以選擇了資料比較完整的氣象資料~~
第四:演算法和模型
step1:特徵工程(feature selection)
Y是氣溫,X是6個與氣溫相關的參量,為了預測準確,要排除X之間的相關性,找到獨立的與Y 相關的X,用到了相關係數來對比
程式碼如下:
np. random . shuffle ( weather ) z = (weather [:, 7], weather [: ,5] , weather [: ,10], weather [: ,11] , weather [: ,13] ,weather [: ,16] , weather [: ,21]) z = np. transpose (z) cor = np. corrcoef (z, rowvar =0) np.savetxt("C:\\Users\\123\\Desktop\\weather\\mydata.csv",cor,delimiter=",")
由相關係數找到和氣溫最相關的四個變數作為輸入x
step2:CV交叉驗證來看一下不同分類器會不會overfitting,以Random Forest分類器為例
程式碼如下:
from sklearn.ensemble import RandomForestRegressor
from sklearn.learning_curve import validation_curve
np. random . shuffle ( weather )
y = weatherall [:, 7]
x = np. vstack ((weatherall [:, 10], weatherall [:, 11],weatherall [:, 14], weatherall [:, 21]))
x = np. transpose (x)
x = preprocessing . scale (x)
RF = RandomForestRegressor()
train_loss,test_loss = validation_curve(RF,x,y,,cv=10,scoring='mean_squared_error'.train_sizes=[0.1,0.25,0.5,0.75,1])
train_loss_mean = -np.mean(train_loss,axis=1)
test_loss_mean = -np.mean(test_loss,axis=1)
plt.figure()
plt.plot(param_range,train_loss_mean,'o-',c='r',label='Training')
plt.plot(param_range,test_loss_mean,'o-',c='b',label='Cross_validation')
plt.xlabel('Training exapmles')
plt.ylabel('Loss')
plt.legend(loc='best')
plt.title("10 CV on Random Forest ")
plt.show()
視覺化如下:
從視覺化結果看,training過程中訓練集合驗證集的loss一直下降,說明能計算機能一直很好的學到知識,不會有overfitting的問題,換用其他幾個模型(lr/DT/SVM/KNN/SGD/GB)也是同樣的效果,這可能和資料有直接的關係.
step3:各個分類器的比較(殘差,錯誤率),以GradientBoost為例,其他的LInear Regression,SGD,KNN,SVM,DT和整合演算法RF,ET都是類似的方法
程式碼如下:
gb = GradientBoostingRegressor()
y_gb = gb . fit ( x_train , y_train).predict ( x_test )
print "Residual sum of Gradient Boosting Regression squares is", np. mean(( y_gb - y_test ) ** 2)
得到各個分類器的結果如下:
從error看出,在Sklearn預設引數的前提下,整合演算法的錯誤率是最低的.
將Gradient Boost的訓練集,測試集和預測集視覺化:可以看出來預測結和之前視覺化的2015年的氣溫跟分佈趨勢還是比較吻合的.
以上就是機器學習的基本的流程以及模型選擇以及結果預測,總結如下:
1.data和feature比演算法和模型重要,data和feature已經決定了誤差上界,模型和演算法只是逼近這一上界的手段
2.sklearn的各種演算法的調參對錯誤率結果也會產生影響,在預設引數的情況下,準確率的的排列順序是整合演算法>SVM>DT>其他,但是也可以通過優化引數來提高各分類器的準確率
3.在機器學習過程中,overfitting是一定要注意的,通過cv_可以看出來分類器過擬合的情況
4.總體而言,整合分類器比單個的機器學習分類器的效果要好,這是整合學習將多個個體分類器聯合起來預測結果,分而治之,弱弱變強的思想.