判断电离层是否存在自由电子
數據集介紹
用到的數據集叫作電離層(Ionosphere),這些數據是由高頻天線收集的。這些天線的目 的是偵測在電離層和高層大氣中存不存在由自由電子組成的特殊結構。如果一條數據能給出特殊 結構存在的證據,這條數據就屬于好的那一類(在數據集中用“g”表示),否則就是壞的(用“b” 表示)。我們要做的就是建立分類器,自動判斷這些數據的好壞。
這個數據可以從http://archive.ics.uci.edu/ml/datasets/Ionosphere中的Datafolder中下載,下載 ionosphere.data 和 ionosphere.names
該數據集每行有35個值,前34個為17座天線采集的數據(每座天線采集兩個數據)。后一 個值不是“g”就是“b”,表示數據的好壞,即是否提供了有價值的信息。
數據預處理
import os # #把path中包含的"~"和"~user"轉換成用戶目錄 home_folder = os.path.expanduser("~") print(home_folder)通過這種方式就可以很快的定位到用戶目錄了。輸出結果是:
C:\Users\mi
加載數據集前,用Data文件夾路徑、數據集所在的文件夾名稱和數據集名稱組合成數據集文件的完整路徑。
# Change this to the location of your dataset# os.path.join(path1[, path2[, ...]])把目錄和文件名合成一個路徑 data_folder = os.path.join(home_folder, "Data", "Ionosphere") data_filename = os.path.join(data_folder, "ionosphere.data") print(data_folder) print(data_filename)輸出結果是:
C:\Users\mi\Data\Ionosphere
C:\Users\mi\Data\Ionosphere\ionosphere.data
創建Numpy數組X和y存放數據集。數據集大小已知,共有351行34列。
# Size taken from the dataset and is known X = np.zeros((351, 34), dtype='float') y = np.zeros((351,), dtype='bool')Ionosphere數據集文件為CSV(Comma-Separated Values,用逗號分隔數據項)格式,這是常 用的數據集存儲格式。我們用csv模塊來導入數據集文件,并創建csv閱讀器對象。
接著,遍歷文件中的每一行數據。每行數據代表一組測量結果。
獲取每一個個體的值,將其強制轉化為浮點型,保存到X中。
后,獲取每個個體后一個表示類別的值,把字母轉化為數字,如果類別為“g”,值為1, 否則值為0。
with open(data_filename, 'r') as input_file:reader = csv.reader(input_file)for i, row in enumerate(reader):# Get the data, converting each item to a floatdata = [float(datum) for datum in row[:-1]]# Set the appropriate row in our datasetX[i] = data# 1 if the class is 'g', 0 otherwisey[i] = row[-1] == 'g'# 前350個數給X,最后一個判斷是g還是b的數給y,也就是有了最后一行語句, # 把row的倒數第一給了y下面對數據劃分為訓練集和測試集
from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=14) print("There are {} samples in the training dataset".format(X_train.shape[0])) print("There are {} samples in the testing dataset".format(X_test.shape[0])) print("Each sample has {} features".format(X_train.shape[1]))默認是25%作為測試集和75%作為訓練集。
輸出結果是:
There are 263 samples in the training dataset
There are 88 samples in the testing dataset
Each sample has 34 features
訓練和預測
我們使用K臨近算法進行訓練。
from sklearn.neighbors import KNeighborsClassifierestimator = KNeighborsClassifier() estimator.fit(X_train, y_train) y_predicted = estimator.predict(X_test) print(y_predicted) accuracy = np.mean(y_test == y_predicted) * 100 print("The accuracy is {0:.1f}%".format(accuracy))輸出結果是:
[ True True True True True False True False True True True True
True True False False True False False True True True True False
True True True True True True True True True False False True
True True True True True False True False True True True True
False True True True True True False True True True True True
False True True True True True True True False False False True
True False True True True False False True False True True False
True True False True]
The accuracy is 86.4%
啟示:我們可以通過比較是否相同求均值的辦法來計算準確率。
設置參數
先進性交叉驗證:
from sklearn.cross_validation import cross_val_score# by using cross validation we can generate three scores 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%
K臨近算法最重要的一個參數是選擇多少個臨近值作為參數。
如圖所示,如果我們想把三角形正確分類。對于a圖而言,我們想把三角形分到圓形里面,如果臨近值選的太小,就會受到菱形的影響而錯誤的分為菱形。對于b圖而言,我們想把三角形歸為菱形,如果臨近值選的太大,就會受到4個圓的影響而被錯誤的歸到圓里面。
為了選出一個比較好的臨近值,一個簡單的思路,比如說從1-20的所有臨近值里面每一個都試試看,看到底哪個效果好
avg_scores = [] all_scores = [] parameter_values = list(range(1, 21)) # Including 20 for n_neighbors in parameter_values:estimator = KNeighborsClassifier(n_neighbors=n_neighbors)scores = cross_val_score(estimator, X, y, scoring='accuracy')avg_scores.append(np.mean(scores))all_scores.append(scores)我們把avg_scores的值可以用圖來畫出來看看:
from matplotlib import pyplot as plt plt.figure(figsize=(32,20)) plt.plot(parameter_values, avg_scores, '-o', linewidth=5, markersize=24)從圖中可以看出,雖然有一些曲折變化,但總體來說,隨著臨近值得增加,正確率在不斷下降。
參考資料
《Python數據挖掘入門與實踐》
總結
以上是生活随笔為你收集整理的判断电离层是否存在自由电子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用OneR算法对Iris植物数据进行分类
- 下一篇: 标准预处理