用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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...