用scikit-learn估計值分類——近鄰演算法(KNN)

来源:http://www.cnblogs.com/llhy1178/archive/2017/05/19/6876785.html
-Advertisement-
Play Games

用scikit-learn估計值分類主要是為數據挖掘搭建通用的框架。有了這個框架之後,增加了演算法的泛化性,減少了數據挖掘的複雜性。 用scikit-learn估計值分類有這三個方面: 1. 估計器(estimator):用於分類、聚類和回歸分析。 2. 轉換器(transformer):用於數據的預 ...


用scikit-learn估計值分類主要是為數據挖掘搭建通用的框架。有了這個框架之後,增加了演算法的泛化性,減少了數據挖掘的複雜性。

用scikit-learn估計值分類有這三個方面:

                  1. 估計器(estimator):用於分類、聚類和回歸分析。

                  2. 轉換器(transformer):用於數據的預處理和數據的轉換。

                  3. 流水線(pipeline):組合數據挖掘流程,便於再次使用。

近鄰(kNN,k-NearestNeighbor)分類演算法是標準數據挖掘分類技術中最為直觀的一種。為了對新個體進行分類,它查找訓練集,找到了與新個體最相似的那些個體,看看這些個體大多屬於哪個類別,
就把新個體分到哪個類別。近鄰演算法幾乎可以對任何數據進行分類,但是要計算數據集中每兩個個體之間的距離,計算量很大。同時還有一個問題是在特征取離散值的數據集上表現很差。

距離是一個很關鍵的問題。歐式距離(兩個點之間直線距離)、曼哈頓距離(兩個特征在標準坐標系中絕對軸距之和)、餘弦距離(特征向量夾角的餘弦值)。

接下來我們利用一個叫電離層的數據集(http://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/)來分析近鄰演算法的運用。在這個網站里點擊ionosphere.data,之後複製這個數據,保存在本地。然後,我們來進行近鄰演算法的實現吧!

import csv
import numpy as np

# 創建兩個數組分別存放特征值和類別
x = np.zeros((351, 34), dtype="float")
y = np.zeros((351, ), dtype="bool")
'''
with open("ionosphere.data", 'r') as input_file:
    reader = csv.reader(input_file)
'''
input_file = open('ionosphere.data', 'r')
reader = csv.reader(input_file)

# 遍歷文件中每一行數據,每一行數據相當於一個個體,用枚舉函數來獲取每一行的索引值,更新數據集x。
for i, row in enumerate(reader):
    data = [float(datum) for datum in row[:-1]]
    x[i] = data
    y[i] = row[-1] == "g"

# 建立測試集和訓練集。
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=14)
# print "There are {0} samples in training dataset".format(x_train.shape[0])
# print "There are {0} samples in testing dataset".format(x_test.shape[0])
# print "Each sample has {0} features".format(x_train.shape[1])

# 然後導入K近鄰分類器這個類,併為其初始化一個實例。
from sklearn.neighbors import KNeighborsClassifier
# 創建一個估計器
estimator = KNeighborsClassifier()
# 創建好之後,開始用訓練數據進行訓練。K近鄰估計器會分析訓練集中的數據,通過比較待分類的新數據點和訓練集中的數據,找到新數據點的近鄰。
estimator.fit(x_train, y_train)
# 接著用測試集測試演算法。
y_predicted = estimator.predict(x_test)
accuracy = np.mean(y_test == y_predicted) * 100
print "The accuracy is {0:.1f}%".format(accuracy)
# The accuracy is 86.4%
# 正確率很高,但是僅僅是使用預設的參數,在某些具體的情況下是不能通用的,所以,要學著根據實驗的實際情況,儘可能選用合適的參數值,爭取達到最佳的效果。

# 我們通常用訓練集訓練演算法,然後在測試集上評估效果。當測試集很簡單,我們就會認為演算法表現很出色。反之,我們可能會認為演算法很糟糕。其實,只是憑一次的測試或一次的訓練,是很難真正決定一個演算法的好壞。所以,此時我們就要用到交叉檢驗了(將數據分割成很多部分,多次測試)。
'''
交叉檢驗:
1.將整個大數據集分成幾個部分
2.對於每一部分執行以下操作:
將其中一部分作為當前測試集
用剩餘部分去訓練演算法
在當前測試集上測試演算法
3.記錄每一次得分及平均得分
4.在上述過程中,每條數據只能在測試集中出現一次,以減少運氣成分。
'''
# 導入cross_val_score交叉檢驗方式
from sklearn.model_selection import cross_val_score
scores = cross_val_score(estimator, x, y, scoring="accuracy")
average_accuracy = np.mean(scores) * 100
print "The average accuracy is {0:.1f}%".format(average_accuracy)
# The average accuracy is 82.3%
# 設置參數。參數設置對於一個演算法很重要,靈活的設置參數能大大提高演算法的泛化能力,所以,選取好的參數值跟數據集的特征息息相關。
# 在近鄰演算法中,最重要的參數(n_neighbors)是選取多少個近鄰作為預測依據。它過大過小會造成不同的分類結果。
# 下麵我們測試n_neighbors的值,比如1到20,可以重覆進行多次實驗,觀察不同參數所帶來的結果之間的差異。
from collections import defaultdict
avg_scores = []
all_scores = defaultdict(list)
for n_neighbors in xrange(1,21):
    estimator_ = KNeighborsClassifier(n_neighbors=n_neighbors)
    scores = cross_val_score(estimator_, x, y, scoring="accuracy")
    avg_scores.append(np.mean(scores))
    all_scores[n_neighbors].append(scores)

# 為了更直觀的觀察差異,我們可以用圖來表示。
from matplotlib import pyplot as plt
parameter_values = list(range(1,21))
#plt.plot(parameter_values, avg_scores, "-o")
#plt.show()
plt.figure(figsize=(32,20))
plt.plot(parameter_values, avg_scores, '-o', linewidth=5, markersize=24)
plt.axis([0, max(parameter_values), 0, 1.0])
# plt.show()
# 可以看出隨著近鄰數的增加,正確率不斷下降。


# 對數據預處理
'''
對於不同特征的取值範圍千差萬別,常見的解決方法是對不同的特征進行規範化,使它們的特征值落在相同的值域或從屬於某幾個確定的類別。
'''
# 選擇最具區分度的特征、創建新特征等都屬於預處理的範疇。
# 預處理示例
x_broken = np.array(x)
# 對數據的第三個特征的值除以10
x_broken[:,::2] /= 10
# print x_broken
# 再來計算正確率
original_scores = cross_val_score(estimator, x, y, scoring='accuracy')
print "The original average accuracy for is {0:.1f}%".format(np.mean(original_scores) * 100)
# The original average accuracy for is 82.3%
broken_scores = cross_val_score(estimator, x_broken, y, scoring="accuracy")
print "The broken average accuracy for is {0:.1f}%".format(np.mean(broken_scores) * 100)
# The broken average accuracy for is 71.5%
# 這次跌到71.5%。如果,把特征值轉變到0到1之間就能解決這個問題。將特征值規範化,使用minmaxscaler類。
from sklearn.preprocessing import MinMaxScaler
# 不需要單獨進行訓練,直接調用fit_transform()函數,即可完成訓練和轉換。
# x_transformed = MinMaxScaler().fit_transform(x)
# 接下來將前面的broken數據拿來測試
x_transformed = MinMaxScaler().fit_transform(x_broken)
transformed_scores = cross_val_score(estimator, x_transformed, y, scoring="accuracy")
print "The average accuracy for is {0:.1f}%".format(np.mean(transformed_scores) * 100)
# The average accuracy for is 82.3%
# 正確率再次升到82.3%說明將特征值規範化有利於減少異常值對近鄰演算法的影響。

# 流水線
# 實現一個數據挖掘流水線,能大大提高效率。它就好比一個框架,能夠有效的將轉換器和估計器結合。
from sklearn.pipeline import Pipeline
# 流水線的核心是元素為元組的列表。第一個元組規範特征取值範圍,第二個元組實現預測功能。
scaling_pipeline = Pipeline([("scale", MinMaxScaler()), ("predict", KNeighborsClassifier())])
scores_1 = cross_val_score(scaling_pipeline, x_broken, y, scoring="accuracy")
print "The pipeline scored_1 an average accuracy for is {0:.1f}%".format(np.mean(scores_1) * 100)
# The pipeline scored_1 an average accuracy for is 82.3%
# 運行結果與之前的一樣,說明設置流水線很有用,因為它能確保代碼的複雜程度不至於超出掌控範圍。
# 我們再將數據規範化應用到原始數據集上,看看能不能使準確率上升,以說明數據集規範化能提升沒有異常值的數據。
scores_2 = cross_val_score(scaling_pipeline, x, y, scoring="accuracy")
print "The pipeline scored_2 an average accuracy for is {0:.1f}%".format(np.mean(scores_2) * 100)
# The pipeline scored_2 an average accuracy for is 82.3%
# 這個結果說明,數據規範化只能將含有異常值的數據集的準確率提高。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用 PMIC_RGS_VCDT_HV_DET 判斷 charger 是否有 ovp。 LV_VTH : 4.15V ...
  •   UITableView是我們最常用的控制項了,今天我就來介紹一些關於UITableView的黑科技和一些註意的地方。 1.修改左滑刪除按鈕的高度   左滑刪除這是iOS最先發明的,之後安卓開始模仿。有時候我們需要對他進行自定義,比如添加圖片啊,修改字體和大小 ...
  • 前言: 今日新聞:谷歌宣佈,將Kotlin語言作為安卓開發的一級編程語言。 Kotlin由JetBrains公司開發,與Java 100%互通,並具備諸多Java尚不支持的新特性。 谷歌稱還將與JetBrains公司合作,為Kotlin設立一個非盈利基金會。 一、簡介: Kotlin 是一個基於 J ...
  • 1. 下載openssl,在C盤創建openssl文件夾,解壓下載的zip到openssl文件夾。 2. 找到debug.keystore。 windows下在C:\Users\用戶名\.android,mac下在~/.android/(mac下可能看不見,cmd里cd進去ls可以看見)。 3. c ...
  • 本文完成:在hive里建管理表;註入部分數據;利用sqoop導入mysql中 期間:解決中文亂碼問題 飛行報告故障表 建表命令 查看表 人工灌入少量數據 Windows系統向Linux系統數據傳輸 解決中文亂碼問題 1)顯示終端xshell 屬性里修改為utf-8 編碼格式 2)源文本文件編輯為ut... ...
  • SQLyog-12.4.2版下載,SQLyog最新版下載,SQLyog官網下載,SQLyog Download >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ©Copyright 蕃薯耀 2017年5月19日 http://www.cnblogs.com/fanshuyao/ 註 ...
  • 表中某列有時包含重覆值,需要取出此列中的所有不同值時,就可以使用DISTINCT關鍵字 用法:SELECT DISTINCT column_1,column_2 FROM table_name; 註意:1.DISTINCT只對column_1有效,其後的column_2即使有重覆值也無效 2.其它列 ...
  • 圖形資料庫(Graph Database)是NoSQL資料庫家族中特殊的存在,用於存儲豐富的關係數據,Neo4j 是目前最流行的圖形資料庫,支持完整的事務,在屬性圖中,圖是由頂點(Vertex),邊(Edge)和屬性(Property)組成的,頂點和邊都可以設置屬性,頂點也稱作節點,邊也稱作關係,每 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...