載入資料
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...