機器學習通常的數據集會劃分爲兩個部分:算法
劃分比例:api
想一下以前作的特徵工程的步驟?數組
咱們把特徵工程的接口稱之爲轉換器,其中轉換器調用有這麼幾種形式dom
在sklearn中,估計器(estimator)是一個重要的角色,是一類實現了算法的API機器學習
若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。性能
兩個樣本的距離能夠經過以下公式計算,又叫歐式距離學習
假設咱們有如今幾部電影測試
其中? 號電影不知道類別,如何去預測?咱們能夠利用K近鄰算法的思想spa
def knn_iris(): """ KNN算法對鳶尾花進行分類 """
#獲取數據
iris=load_iris() #劃分數據集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=3) #特徵工程:標準化
transfer=StandardScaler() x_train=transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #KNN算法預估器
estimator=KNeighborsClassifier(n_neighbors=3) estimator.fit(x_train,y_train) #模型評估
#方法1:直接比對真實值和預測值
y_predict=estimator.predict(x_test) print("y_predict:\n",y_predict) print("直接比對真實值和預測值:\n",y_test==y_predict) #方法2:計算準確率
score=estimator.score(x_test,y_test) print("準確率爲:\n",score) return None
結果爲:code
k值取很小:容易受到異常點的影響
k值取很大:受到樣本均衡的問題
距離計算上面,時間複雜度高
交叉驗證目的:爲了讓被評估的模型更加準確可信
交叉驗證:將拿到的訓練數據,分爲訓練和驗證集。如下圖爲例:將數據分紅5份,其中一份做爲驗證集。而後通過5次(組)的測試,每次都更換不一樣的驗證集。即獲得5組模型的結果,取平均值做爲最終結果。又稱5折交叉驗證。
咱們以前知道數據分爲訓練集和測試集,可是爲了讓從訓練獲得模型結果更加準確。作如下處理
一般狀況下,有不少參數是須要手動指定的(如k-近鄰算法中的K值),這種叫超參數。可是手動過程繁雜,因此須要對模型預設幾種超參數組合。每組超參數都採用交叉驗證來進行評估。最後選出最優參數組合創建模型。
def knn_iris_gscv(): """ KNN算法對鳶尾花進行分類,添加網格搜索和交叉驗證 """
#獲取數據
iris=load_iris() #劃分數據集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=36) #特徵工程:標準化
transfer=StandardScaler() x_train=transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #KNN算法預估器
estimator=KNeighborsClassifier() #加上網格搜索與交叉驗證
param_dict={"n_neighbors":[1,3,5,7,9,11]} estimator=GridSearchCV(estimator,param_grid=param_dict,cv=10) estimator.fit(x_train,y_train) #模型評估
#方法1:直接比對真實值和預測值
y_predict=estimator.predict(x_test) print("y_predict:\n",y_predict) print("直接比對真實值和預測值:\n",y_test==y_predict) #方法2:計算準確率
score=estimator.score(x_test,y_test) print("準確率爲:\n",score) print("最佳參數:\n", estimator.best_params_) print("最佳結果:\n", estimator.best_score_) print("最佳估計器:\n", estimator.best_estimator_) print("每次交叉驗證的結果爲:\n", estimator.cv_results_) return None
結果爲: