版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
單元1任務(wù)1.1
機器學(xué)習(xí)任務(wù)1.11.引入相關(guān)模塊os庫是Python標(biāo)準(zhǔn)庫,包含幾百個函數(shù),常用的是路徑操作、進程管理、環(huán)境參數(shù)類型。os就是“operatingsystem”的縮寫,os模塊提供的就是各種Python程序與操作系統(tǒng)進行交互的接口。使用os模塊,一方面,可以方便地與操作系統(tǒng)qq進行交互;另一方面,可以極大地增強代碼的可移植性。NumPy(NumericalPython)是Python語言的一個擴展程序庫,支持大量的維度數(shù)組與矩陣運算,也針對數(shù)組運算提供大量的數(shù)學(xué)函數(shù)庫。代碼如下:importosimportnumpyasnp類用來描述具有相同屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。1)重寫構(gòu)造函數(shù)2.定義Banknotes類任務(wù)1.1classBanknotes:
def__init__(self,feature_dir):
self.feature_dir=feature_dir#特征文件的路徑
self.features=None#特征值2)定義加載模型的方法任務(wù)1.1defload_model(self):
ifos.path.exists(self.feature_dir):
withopen(self.feature_dir,'r')asf:
line=f.readline().strip()
self.features=np.array(list(map(float,line.split(','))))
returnTrue
else:
path='/'.join(self.feature_dir.split('/')[:-1])
ifnotos.path.exists(path):
os.mkdir('model')
returnFalse04模型訓(xùn)練3)定義加載數(shù)據(jù)集的方法defload_dataset(self,dataset_path):
ifos.path.exists(dataset_path):#判斷數(shù)據(jù)集文件是否存在
withopen(dataset_path,'r')asf:#打開數(shù)據(jù)集文件
lines=f.readlines()#按行讀取所有數(shù)據(jù)
np.random.shuffle(lines)#按行打亂順序
train_inputs=[]#訓(xùn)練數(shù)據(jù)輸入
train_lables=[]#訓(xùn)練數(shù)據(jù)標(biāo)簽
test_inputs=[]#測試數(shù)據(jù)輸入
test_labels=[]#測試數(shù)據(jù)標(biāo)簽
forlineinlines[:int(len(lines)*0.8)]:#遍歷前80%的數(shù)據(jù),將其解析并放入訓(xùn)練集,每行前4個數(shù)據(jù)作為輸入數(shù)據(jù),最后1個數(shù)據(jù)作為標(biāo)簽
line_array=line.strip().split(',')
train_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)
train_lables.append(int(line_array[4]))
forlineinlines[int(len(lines)*0.2):]:#遍歷后20%的數(shù)據(jù),將其解析并放入測試集,每行前4個數(shù)據(jù)作為輸入,最后1個數(shù)據(jù)作為標(biāo)簽
line_array=line.strip().split(',')
test_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)
test_labels.append(int(line_array[4]))
#臨時保存訓(xùn)練集和驗證集
self.train_dataset,self.test_dataset=[train_inputs,train_lables],[test_inputs,test_labels]04模型訓(xùn)練3)定義加載數(shù)據(jù)集的方法defload_dataset(self,dataset_path):
ifos.path.exists(dataset_path):#判斷數(shù)據(jù)集文件是否存在
withopen(dataset_path,'r')asf:#打開數(shù)據(jù)集文件
lines=f.readlines()#按行讀取所有數(shù)據(jù)
np.random.shuffle(lines)#按行打亂順序
train_inputs=[]#訓(xùn)練數(shù)據(jù)輸入
train_lables=[]#訓(xùn)練數(shù)據(jù)標(biāo)簽
test_inputs=[]#測試數(shù)據(jù)輸入
test_labels=[]#測試數(shù)據(jù)標(biāo)簽04模型訓(xùn)練3)定義加載數(shù)據(jù)集的方法forlineinlines[:int(len(lines)*0.8)]:#遍歷前80%的數(shù)據(jù),將其解析并放入訓(xùn)練集,每行前4個數(shù)據(jù)作為輸入數(shù)據(jù),最后1個數(shù)據(jù)作為標(biāo)簽
line_array=line.strip().split(',')
train_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)
train_lables.append(int(line_array[4]))04模型訓(xùn)練forlineinlines[int(len(lines)*0.2):]:#遍歷后20%的數(shù)據(jù),將其解析并放入測試集,每行前4個數(shù)據(jù)作為輸入,最后1個數(shù)據(jù)作為標(biāo)簽
line_array=line.strip().split(',')
test_inputs.append([1.0,float(line_array[0]),float(line_array[1]),float(line_array[2]),float(line_array[3])])#數(shù)據(jù)
test_labels.append(int(line_array[4]))
#臨時保存訓(xùn)練集和驗證集
self.train_dataset,self.test_dataset=[train_inputs,train_lables],[test_inputs,test_labels]3)定義加載數(shù)據(jù)集的方法04模型訓(xùn)練4)定義sigmoid函數(shù)/方法sigmoid函數(shù)是常見的S型函數(shù),也被稱為S型生長曲線,由于其具有單調(diào)遞增、反函數(shù)單調(diào)遞增等性質(zhì),因此其常被用作神經(jīng)網(wǎng)絡(luò)的閾值函數(shù),將變量映射到0與1之間。函數(shù)的原型為sigmoid函數(shù)的圖像04模型訓(xùn)練#sigmoid函數(shù)即得分函數(shù),用于計算數(shù)據(jù)x的概率是0還是1。#若得到的y大于0.5,則概率是1;若得到的y小于或等于0.5,則概率是0
defsigmoid(self,x):
return1/(1+np.exp(-x))4)定義sigmoid函數(shù)/方法04模型訓(xùn)練5)定義代價函數(shù)/方法代價函數(shù),也叫損失函數(shù),它在機器學(xué)習(xí)的每種算法中都很重要,因為訓(xùn)練模型的過程就是優(yōu)化代價函數(shù)的過程,代價函數(shù)對每個參數(shù)的偏導(dǎo)數(shù)就是梯度下降算法中提到的梯度,為防止過擬合而添加的正則化項也是加在代價函數(shù)后面的。#代價函數(shù),hx是概率估計值,也是由sigmoid(x)得來的值;y是樣本真值
defcost(self,hx,y):
return-y*np.log(hx)-(1-y)*np.log(1-hx)04模型訓(xùn)練6)定義梯度下降算法微分單變量的微分,函數(shù)只有一個變量時多變量的微分,當(dāng)函數(shù)有多個變量的時候,即分別對每個變量進行求微分04模型訓(xùn)練6)定義梯度下降算法梯度實際上就是多變量微分的一般化梯度就是分別對每個變量進行微分,然后用逗號分割開,梯度是用<>包括起來,說明梯度其實一個向量。在單變量的函數(shù)中,梯度其實就是函數(shù)的微分,代表著函數(shù)在某個給定點的切線的斜率在多變量函數(shù)中,梯度是一個向量,向量有方向,梯度的方向就指出了函數(shù)在給定點的上升最快的方向。梯度的方向是函數(shù)在給定點上升最快的方向,那么梯度的反方向就是函數(shù)在給定點下降最快的方向04模型訓(xùn)練6)定義梯度下降算法此公式的意義是:J是關(guān)于Θ的一個函數(shù),我們當(dāng)前所處的位置為Θ0點,要從這個點走到J的最小值點。首先我們先確定前進的方向,也就是梯度的反向,然后走一段距離的步長,也就是α,走完這個段步長,就到達了Θ1這個點。04模型訓(xùn)練6)定義梯度下降算法#梯度下降,x是輸入數(shù)據(jù),y是標(biāo)簽集,learning_rate是學(xué)習(xí)率
defgradient(self,x,y,learning_rate):
m=len(y)#計算標(biāo)簽集的長度
matrix_gradient=np.zeros(len(x[0]))#創(chuàng)建一個全0的梯度列表
foriinrange(m):#遍歷輸入數(shù)據(jù)與標(biāo)簽集,計算梯度
current_x=x[i]
current_y=y[i]
current_x=np.asarray(current_x)#輸入特征轉(zhuǎn)換為Numpy數(shù)組,計算預(yù)測值(通過sigmoid函數(shù))
matrix_gradient+=(self.sigmoid(np.dot(self.features,current_x))-current_y)*current_x#計算梯度公式(預(yù)測值-真實值)*輸入特征
self.features=self.features-learning_rate*matrix_gradient#遵循梯度下降原則,更新特征數(shù)據(jù)04模型訓(xùn)練7)定義誤差計算函數(shù)
模型的輸出結(jié)果和其對應(yīng)的真實值之間往往會存在一些差異,這些差異稱為該模型的輸出誤差,簡稱誤差。誤差函數(shù)是用來計算實際和預(yù)測的差別的。訓(xùn)練誤差是指模型在訓(xùn)練集上的平均損失,測試誤差是指模型在測試集上的平均損失。訓(xùn)練誤差的大小對判斷給定的問題是不是一個容易學(xué)習(xí)的問題具有一定意義,但其本質(zhì)上不重要。測試誤差反映了學(xué)習(xí)方法對未知的測試集的預(yù)測能力,是學(xué)習(xí)中的重要概念。機器學(xué)習(xí)在訓(xùn)練模型時,都會把樣本集分為訓(xùn)練集和測試集。其中,訓(xùn)練集用來完成算法模型的學(xué)習(xí)和訓(xùn)練,而測試集用來評估訓(xùn)練好的模型對于數(shù)據(jù)的預(yù)測性能。此時要考慮評估的性能是否合理。04模型訓(xùn)練7)定義誤差計算函數(shù)#誤差計算,x是輸入數(shù)據(jù),y是標(biāo)簽集,返回平均誤差
deferror(self,x,y):
total=len(y)
error_num=0#初始化錯誤計數(shù)變量
foriinrange(total):
current_x=x[i]#將當(dāng)前樣本的特征值賦值給current_x
current_y=y[i]#將當(dāng)前樣本的標(biāo)簽賦值給current_y
hx=self.sigmoid(np.dot(self.features,current_x))#LR算法
ifself.cost(hx,current_y)>0.5:#進一步計算損失
比較損失與閾值0.5的大小,判斷是否預(yù)測錯誤
error_num+=1
returnerror_num/total04模型訓(xùn)練8)定義訓(xùn)練函數(shù)#訓(xùn)練函數(shù),learning_rate是學(xué)習(xí)率,num_iter是迭代次數(shù)
deftrain(self,learning_rate,num_iter):
[train_inputs,train_lables]=self.train_dataset#獲取訓(xùn)練輸入數(shù)據(jù)和標(biāo)簽
n=len(train_inputs[0])
self.features=np.ones(n)#初始化特征值
dataMat=np.asarray(train_inputs)#將輸入數(shù)據(jù)和標(biāo)簽轉(zhuǎn)為numpy數(shù)組
labelMat=np.asarray(train_lables)
foriinrange(num_iter+1):
self.gradient(dataMat,labelMat,learning_rate)#梯度下降算法
ifi%10==0:#每10輪計算1次誤差,打印當(dāng)前數(shù)據(jù)
err=self.error(dataMat,labelMat)
print(f‘迭代次數(shù):{i:<6}誤差值:{err:<20}’)
withopen(self.feature_dir,‘w’)asf:#保存特征數(shù)據(jù)
feature=[str(f)forfinself.features]
f.writelines(','.join(feature))04模型訓(xùn)練8)定義測試函數(shù)deftest(self,test_dataset=None,show=False):
[test_inputs,test_labels]=test_dataset
total=len(test_labels)
error_num=0
right_num=0
forti,tlinzip(test_inputs,test_labels):#遍歷測試集
#統(tǒng)計測試結(jié)果,如果預(yù)測值與真值相同,則準(zhǔn)確數(shù)據(jù)+1;如果預(yù)測值與真值不同,則錯誤數(shù)據(jù)+1
if(np.dot(np.array(ti),self.features.T)<0.5andtl==0)or(np.dot(np.array(ti),self.fea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《保險理財知識講座》課件
- 圖書工作計劃加強對圖書采編質(zhì)量的監(jiān)督提高藏書水平
- 常溫遠紅外陶瓷及制品相關(guān)行業(yè)投資規(guī)劃報告
- 石膏制品運輸協(xié)議三篇
- 醫(yī)用氮氣系統(tǒng)相關(guān)行業(yè)投資方案范本
- 放射性廢氣處置設(shè)備相關(guān)項目投資計劃書范本
- 營造積極向上的班級氣氛計劃
- 我的家鄉(xiāng)湖口
- 生物上冊動物行為的生理基礎(chǔ)課件蘇教
- 《設(shè)計法規(guī)與標(biāo)準(zhǔn)》課件
- 初中英語七年級寫作評價量表
- 西餐廚房管理制度
- 預(yù)防接種證明書出國填寫英文
- GB 38508-2020 清洗劑揮發(fā)性有機化合物含量限值
- 吊裝作業(yè)施工方案(模板)
- 初中綜合實踐課程標(biāo)準(zhǔn)
- 日本江崎格力高歷史
- 代扣服務(wù)協(xié)議
- SPSS統(tǒng)計軟件在考試成績分析中的應(yīng)用
- 某燃煤采暖鍋爐煙氣除塵系統(tǒng)設(shè)計1
- 中心試驗室標(biāo)準(zhǔn)化管理辦法
評論
0/150
提交評論