1、背景與挖掘目標
有經驗的從事漁業生產的從業者可通過觀察水色變化調控水質,以維持養殖體系水體生態系統中浮游植物、微生物類、浮游動物等合理的動態平衡。由於這些多是通過經驗和肉眼觀察進行判斷的,存在主管性引起的觀察性偏倚,使觀察結果的可比性、可重複性降低,不易推廣應用。當前,數字圖像處理技術是基於計算機視覺的,以專家經驗爲基礎,對池塘水色進行優劣分級,實現對池塘水色的準確快速判別。
2、從採集到的原始水樣圖像中進行選擇性抽取與實時抽取,形成建模數據和增量數據。
3、對(2)中形成的兩個數據集進行數據預處理,包括圖像切割和顏色矩特徵提取。
4、利用(3)形成的已完成數據預處理的建模數據,由有經驗的專家對水樣圖像根據經驗進行分類,構建專家樣本。
5、利用(4)的專家樣本構建分類模型。
特徵的取值範圍都在0~1之間,也就是說,如果直接輸入SVM模型的話,彼此之間區分度會比較好,因此不妨將所有特徵都統一乘以一個適當的常數k,從而提高區分度和準確率。常數k的選取不能過大也不能過小,過小導致區分度較低,模型精確度差,較大則容易導致模型在訓練樣本中過擬合。可以根據測試準確率來選擇k的最優值。
6、利用(5)的構建好的分類模型進行水質評價。
#coding:utf-8
import pandas as pd
inputfile = './data/moment.csv' #數據文件
data = pd.read_csv(inputfile, encoding='gbk') #讀取數據,指定編碼爲gbk
data = data.as_matrix() #將讀取的數據轉化爲矩陣
from random import shuffle #引入隨機函數
shuffle(data) #隨機打亂數據
data_train = data[:int(0.8*len(data)), :] #選取前80%爲訓練數據 逗號左邊是行範圍,逗號右邊列範圍,結果切片
data_test = data[int(0.8*len(data)):, :] #選取後20%爲測試數據
x_train = data_train[:, 2:]*30 #放大特徵
y_train = data_train[:, 0].astype(int)
x_test = data_test[:, 2:]*30 #放大特徵
y_test= data_test[:, 0].astype(int)
#導入模型相關函數,建立並且訓練模型
from sklearn import svm
model = svm.SVC()
model.fit(x_train, y_train)
import pickle
pickle.dump(model, open('./tmp/svm.model','wb'))
#最後一句保存模型,以後可以通過下面語句重新加載模型
# model = pickle.load(open('./tmp/svm.model','rb'))
#導入輸出相關的庫,生成混淆矩陣
from sklearn import metrics
cm_train = metrics.confusion_matrix(y_train, model.predict(x_train)) #訓練樣本的混淆矩陣
cm_test = metrics.confusion_matrix(y_test, model.predict(x_test)) #測試樣本的混淆矩陣
#保存結果
outputfile1 = './tmp/cm_train.xls'
outputfile2 = './tmp/cm_test.xls'
pd.DataFrame(cm_train).to_excel(outputfile1)
pd.DataFrame(cm_test).to_excel(outputfile2)
cm_train.xls
0 1 2
0 108 0 0
1 0 35 0
2 3 0 16
cm_test.xls
0 1 2 3
0 13 0 0 0
1 2 11 0 0
2 1 0 13 0
3 0 1 0 0
參考自:《python數據分析與挖掘》 --張良均