機器學習系列(五) 邏輯回歸(鶯尾花資料集)

2021-10-11 03:07:25 字數 3779 閱讀 3185

載入資料

import numpy as np

import pandas as pd

data = pd.read_csv('iris.csv')

# 去掉不需要的id列

data.drop('id',axis=1,inplace=true)

# 刪除重覆記錄

data.drop_duplicates(inplace=true)

## 進行對映

de = data['species'].drop_duplicates()

# print(de)

# setosa virginica versicolor

data['species'] = data['species'].map()

# 只選取類別為0 1 的鶯尾花資料 進行邏輯回歸的二分類

data = data[data['species'] != 2]

# print(len(data))

邏輯回歸類

class logisticregression:

# 實現邏輯回歸

def __init__(self,alpha,times):

# 初始化方法

# 引數: alpha :float 學習率

# times : int 迭代次數

self.alpha = alpha

self.times = times

def sigmoid(self,z):

# sigmoid函式的實現

# 引數: x : float 自變數 值為x = w.t * x

# return p (概率0-1): 返回樣本屬於類別1的概率值,用來作為結果的**

# 當x>= 0.5 (z>=0)時 判定為類別1 否則判定為類別0

return 1.0 / (1.0 + np.exp(-z))

def fit(self,x,y):

# 根據提供的訓練資料 對模型進行訓練

# 引數 : x : 類陣列型別 形狀[樣本數量,特徵數量] 待訓練的樣本特徵屬性

# y : 類陣列型別 形狀為:[樣本數量] 每個樣本的目標值 (標籤)

x = np.asarray(x)

y = np.asarray(y)

# 建立 權重的向量 初始值為0 長度比特徵數多1 (多出來乙個是截距)

self.w_ = np.zeros(1 + x.shape[1])

# 建立損失列表 用來儲存每次迭代後的損失值

self.loss_ =

for i in range(self.times):

z = np.dot(x,self.w_[1:] + self.w_[0])

# 計算概率值(結果判定為1)

p = self.sigmoid(z)

# 根據邏輯回歸的代價函式(目標函式)j(w)=-sum(yi * log(s(zi)) + (1-yi) * log(1-s(zi)))

cost = -np.sum(y * np.log(p) + (1-y) * np.log(1-p))

# 調整權重值 : 根據公式 : 權重(j列) = 權重(j列)+ 學習率*sum(y-s(z))*x(j))

self.w_[0] += self.alpha * np.sum(y-p)

self.w_[1:] += self.alpha * np.dot(x.t,y-p)

def predict_proba(self,x):

# 根據引數傳遞的樣本,對樣本資料進行**

# 引數 : x : 類陣列型別 形狀[樣本數量,特徵數量] 待訓練的樣本特徵屬性

# return : 陣列型別 **結果(概率值)

x = np.asarray(x)

z = np.dot(x,self.w_[1:] + self.w_[0])

p = self.sigmoid(z)

# 將**資料 變成二維陣列(結構) 便於後續的拼接

p = p.reshape(-1,1)

# 將兩個陣列進行拼接 方向為橫向拼接

return np.concatenate([1-p,p],axis=1)

def predict(self,x):

# 根據引數傳遞樣本 對樣本資料進行**

# 引數 x: 類陣列型別 形狀[樣本數量,特徵數量] 待訓練的樣本特徵屬性

# # return : 陣列型別 **結果(分類值)

return np.argmax(self.predict_proba(x),axis=1)

t1 = data[data['species'] == 0]

t2 = data[data['species'] == 1]

t1 = t1.sample(len(t1),random_state=0)

t2 = t2.sample(len(t2),random_state=0)

train_x = pd.concat([t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis =0 )

train_y = pd.concat([t1.iloc[:40,-1],t2.iloc[:40,-1]],axis =0 )

test_x = pd.concat([t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis =0 )

test_y = pd.concat([t1.iloc[40:,-1],t2.iloc[40:,-1]],axis =0 )

# 鶯尾花的特徵列 數以乙個數量級 可以不用標準化處理

lr = logisticregression(alpha=0.01,times=20)

lr.fit(train_x,train_y)

# **的概率值

# print(lr.predict_proba(test_x))

# **的分類值

# print()

# 計算準確性

result = lr.predict_proba(test_x)

# print(np.sum(result == test_y))

print(np.sum((result == test_y)/len(test_y)))

視覺化

#    視覺化

import matplotlib as mpl

import matplotlib.pyplot as plt

# 設定中文顯示

mpl.rcparams['font.family'] = "simhei"

# 設定負號顯示

mpl.rcparams['axes.unicode_minus'] = false

# 繪製**值

plt.plot(result,'ro',ms=15,label='**值')

# 繪製真實值

plt.plot(test_y.values,'go',ms=5,label='真實值')

plt.title("邏輯回歸")

plt.xlabel("樣本序號")

plt.ylabel('類別')

plt.legend()

plt.show()

# 繪製目標函式損失值

plt.plot(range(1,lr.times+1),lr.loss_,'go-')

plt.show()

機器學習 邏輯回歸

邏輯回歸 線性回歸的式子,作為邏輯回歸的輸入 適用場景 二分類 線性回歸的輸入 sigmoid函式 分類 0,1 概率值 計算公式 當目標值為1時 損失函式的變化 當目標值為0時 損失函式的變化 下面用乙個例項來說明邏輯回歸的用法 癌症概率 部分資料的截圖如下 資料描述 699條樣本,供11列資料,...

機器學習 邏輯回歸

coding utf 8 import pandas as pd import seaborn as sns from sklearn.model selection import train test split import matplotlib.pyplot as plt 用於畫圖 from ...

機器學習 邏輯回歸

lr指的是logistic regression,邏輯回歸。而不是linear regression,線性回歸,不要問為什麼,記住它就好了,haha。它是一種監督學習分類演算法,不是回歸演算法!這裡千萬要注意啦。lr常用於二分類問題,0或者1 假如我們有一堆二維資料,也就是這堆資料有2個特徵x1和x...