《機器學習技術》課件 第一章任務1.1 引入相關模塊_第1頁
《機器學習技術》課件 第一章任務1.1 引入相關模塊_第2頁
《機器學習技術》課件 第一章任務1.1 引入相關模塊_第3頁
《機器學習技術》課件 第一章任務1.1 引入相關模塊_第4頁
《機器學習技術》課件 第一章任務1.1 引入相關模塊_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

單元1任務1.1

機器學習任務1.11.引入相關模塊os庫是Python標準庫,包含幾百個函數,常用的是路徑操作、進程管理、環(huán)境參數類型。os就是“operatingsystem”的縮寫,os模塊提供的就是各種Python程序與操作系統(tǒng)進行交互的接口。使用os模塊,一方面,可以方便地與操作系統(tǒng)qq進行交互;另一方面,可以極大地增強代碼的可移植性。NumPy(NumericalPython)是Python語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,也針對數組運算提供大量的數學函數庫。代碼如下:importosimportnumpyasnp類用來描述具有相同屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。1)重寫構造函數2.定義Banknotes類任務1.1classBanknotes:

def__init__(self,feature_dir):

self.feature_dir=feature_dir#特征文件的路徑

self.features=None#特征值2)定義加載模型的方法任務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模型訓練3)定義加載數據集的方法defload_dataset(self,dataset_path):

ifos.path.exists(dataset_path):#判斷數據集文件是否存在

withopen(dataset_path,'r')asf:#打開數據集文件

lines=f.readlines()#按行讀取所有數據

np.random.shuffle(lines)#按行打亂順序

train_inputs=[]#訓練數據輸入

train_lables=[]#訓練數據標簽

test_inputs=[]#測試數據輸入

test_labels=[]#測試數據標簽

forlineinlines[:int(len(lines)*0.8)]:#遍歷前80%的數據,將其解析并放入訓練集,每行前4個數據作為輸入數據,最后1個數據作為標簽

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])])#數據

train_lables.append(int(line_array[4]))

forlineinlines[int(len(lines)*0.2):]:#遍歷后20%的數據,將其解析并放入測試集,每行前4個數據作為輸入,最后1個數據作為標簽

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])])#數據

test_labels.append(int(line_array[4]))

#臨時保存訓練集和驗證集

self.train_dataset,self.test_dataset=[train_inputs,train_lables],[test_inputs,test_labels]04模型訓練3)定義加載數據集的方法defload_dataset(self,dataset_path):

ifos.path.exists(dataset_path):#判斷數據集文件是否存在

withopen(dataset_path,'r')asf:#打開數據集文件

lines=f.readlines()#按行讀取所有數據

np.random.shuffle(lines)#按行打亂順序

train_inputs=[]#訓練數據輸入

train_lables=[]#訓練數據標簽

test_inputs=[]#測試數據輸入

test_labels=[]#測試數據標簽04模型訓練3)定義加載數據集的方法forlineinlines[:int(len(lines)*0.8)]:#遍歷前80%的數據,將其解析并放入訓練集,每行前4個數據作為輸入數據,最后1個數據作為標簽

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])])#數據

train_lables.append(int(line_array[4]))04模型訓練forlineinlines[int(len(lines)*0.2):]:#遍歷后20%的數據,將其解析并放入測試集,每行前4個數據作為輸入,最后1個數據作為標簽

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])])#數據

test_labels.append(int(line_array[4]))

#臨時保存訓練集和驗證集

self.train_dataset,self.test_dataset=[train_inputs,train_lables],[test_inputs,test_labels]3)定義加載數據集的方法04模型訓練4)定義sigmoid函數/方法sigmoid函數是常見的S型函數,也被稱為S型生長曲線,由于其具有單調遞增、反函數單調遞增等性質,因此其常被用作神經網絡的閾值函數,將變量映射到0與1之間。函數的原型為sigmoid函數的圖像04模型訓練#sigmoid函數即得分函數,用于計算數據x的概率是0還是1。#若得到的y大于0.5,則概率是1;若得到的y小于或等于0.5,則概率是0

defsigmoid(self,x):

return1/(1+np.exp(-x))4)定義sigmoid函數/方法04模型訓練5)定義代價函數/方法代價函數,也叫損失函數,它在機器學習的每種算法中都很重要,因為訓練模型的過程就是優(yōu)化代價函數的過程,代價函數對每個參數的偏導數就是梯度下降算法中提到的梯度,為防止過擬合而添加的正則化項也是加在代價函數后面的。#代價函數,hx是概率估計值,也是由sigmoid(x)得來的值;y是樣本真值

defcost(self,hx,y):

return-y*np.log(hx)-(1-y)*np.log(1-hx)04模型訓練6)定義梯度下降算法微分單變量的微分,函數只有一個變量時多變量的微分,當函數有多個變量的時候,即分別對每個變量進行求微分04模型訓練6)定義梯度下降算法梯度實際上就是多變量微分的一般化梯度就是分別對每個變量進行微分,然后用逗號分割開,梯度是用<>包括起來,說明梯度其實一個向量。在單變量的函數中,梯度其實就是函數的微分,代表著函數在某個給定點的切線的斜率在多變量函數中,梯度是一個向量,向量有方向,梯度的方向就指出了函數在給定點的上升最快的方向。梯度的方向是函數在給定點上升最快的方向,那么梯度的反方向就是函數在給定點下降最快的方向04模型訓練6)定義梯度下降算法此公式的意義是:J是關于Θ的一個函數,我們當前所處的位置為Θ0點,要從這個點走到J的最小值點。首先我們先確定前進的方向,也就是梯度的反向,然后走一段距離的步長,也就是α,走完這個段步長,就到達了Θ1這個點。04模型訓練6)定義梯度下降算法#梯度下降,x是輸入數據,y是標簽集,learning_rate是學習率

defgradient(self,x,y,learning_rate):

m=len(y)#計算標簽集的長度

matrix_gradient=np.zeros(len(x[0]))#創(chuàng)建一個全0的梯度列表

foriinrange(m):#遍歷輸入數據與標簽集,計算梯度

current_x=x[i]

current_y=y[i]

current_x=np.asarray(current_x)#輸入特征轉換為Numpy數組,計算預測值(通過sigmoid函數)

matrix_gradient+=(self.sigmoid(np.dot(self.features,current_x))-current_y)*current_x#計算梯度公式(預測值-真實值)*輸入特征

self.features=self.features-learning_rate*matrix_gradient#遵循梯度下降原則,更新特征數據04模型訓練7)定義誤差計算函數

模型的輸出結果和其對應的真實值之間往往會存在一些差異,這些差異稱為該模型的輸出誤差,簡稱誤差。誤差函數是用來計算實際和預測的差別的。訓練誤差是指模型在訓練集上的平均損失,測試誤差是指模型在測試集上的平均損失。訓練誤差的大小對判斷給定的問題是不是一個容易學習的問題具有一定意義,但其本質上不重要。測試誤差反映了學習方法對未知的測試集的預測能力,是學習中的重要概念。機器學習在訓練模型時,都會把樣本集分為訓練集和測試集。其中,訓練集用來完成算法模型的學習和訓練,而測試集用來評估訓練好的模型對于數據的預測性能。此時要考慮評估的性能是否合理。04模型訓練7)定義誤差計算函數#誤差計算,x是輸入數據,y是標簽集,返回平均誤差

deferror(self,x,y):

total=len(y)

error_num=0#初始化錯誤計數變量

foriinrange(total):

current_x=x[i]#將當前樣本的特征值賦值給current_x

current_y=y[i]#將當前樣本的標簽賦值給current_y

hx=self.sigmoid(np.dot(self.features,current_x))#LR算法

ifself.cost(hx,current_y)>0.5:#進一步計算損失

比較損失與閾值0.5的大小,判斷是否預測錯誤

error_num+=1

returnerror_num/total04模型訓練8)定義訓練函數#訓練函數,learning_rate是學習率,num_iter是迭代次數

deftrain(self,learning_rate,num_iter):

[train_inputs,train_lables]=self.train_dataset#獲取訓練輸入數據和標簽

n=len(train_inputs[0])

self.features=np.ones(n)#初始化特征值

dataMat=np.asarray(train_inputs)#將輸入數據和標簽轉為numpy數組

labelMat=np.asarray(train_lables)

foriinrange(num_iter+1):

self.gradient(dataMat,labelMat,learning_rate)#梯度下降算法

ifi%10==0:#每10輪計算1次誤差,打印當前數據

err=self.error(dataMat,labelMat)

print(f‘迭代次數:{i:<6}誤差值:{err:<20}’)

withopen(self.feature_dir,‘w’)asf:#保存特征數據

feature=[str(f)forfinself.features]

f.writelines(','.join(feature))04模型訓練8)定義測試函數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)計測試結果,如果預測值與真值相同,則準確數據+1;如果預測值與真值不同,則錯誤數據+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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論