【机器学习】逻辑回归(LogisticRegression)分类鸢尾花
1.介紹
1.1 sigmoid函數
邏輯回歸中的sigmoid函數:
g(θ0+θ1X1+?θnXn)=h(θX)=p=eθX1+eθXg(θ_0+θ_1X_1+\cdotsθ_nX_n)=h(θX)=p=\frac{e^{θX}}{1+e^{θX}} g(θ0?+θ1?X1?+?θn?Xn?)=h(θX)=p=1+eθXeθX?
也可寫成(分子分母同時除以eθX):
g(θ0+θ1X1+?θnXn)=h(θX)=p=11+e?θXg(θ_0+θ_1X_1+\cdotsθ_nX_n)=h(θX)=p=\frac{1}{1+e^{-θX}} g(θ0?+θ1?X1?+?θn?Xn?)=h(θX)=p=1+e?θX1?
得到的sigmoid函數圖像為:
可知,當θX>=0,即θ0+θ1X1+…+θnXn>=0時,p>=0.5,預測y=1
當θX<0,即θ0+θ1X1+…+θnX<0時,p<0.5,預測y=0
1.2 代價函數
為什么不使用像線性回歸那樣的代價函數?
如圖,因為所得到的代價函數為非凸函數,會有很多個局部最優解,使用梯度下降時不一定能夠收斂到全局最小值。
sigmoid函數:
hθ(x)=11+e?θxh_\theta(x)=\frac{1}{1+e^{-\theta x}} hθ?(x)=1+e?θx1?
因此,采用如下的代價函數:
寫在一起如下:
使用梯度下降求θ:
?J(θ)?θj=(hθ(x)?y)xj\frac{\partial J(\theta)}{\partial\theta_j}= (h_\theta(x)-y)x_j ?θj??J(θ)?=(hθ?(x)?y)xj?
可得:
θj:=θj?α∑i=1m(hθ(x)(i)?y(i))xj(i)\theta_j:=\theta_j-\alpha\sum_{i=1}^m(h_\theta(x)^{(i)}-y^{(i)})x_j^{(i)} θj?:=θj??αi=1∑m?(hθ?(x)(i)?y(i))xj(i)?
其中i表示第幾個樣本,j表示第幾個特征值
1.3 多元分類:一對多
思想:將多個類別分成獨立的二元問題,然后分別求出各個分類的代價函數,再將測試集的數據代入所獲得的結果中,取結果最大的預測概率,就能判斷出這個數據屬于哪一個類別。
使用邏輯回歸將鳶尾花數據進行分類。鳶尾花數據為3類,屬于多元分類問題。可以將其分解成多個二元問題,即對于每個類別,進行模型訓練得到模型,然后對于測試集中的每個數據,使用得到的參數對其進行計算,得到的最大值即為這個數據屬于的類別。
2.代碼
"""@Author: sanshui @Time:2021/11/15 15:15 @Software: PyCharm """import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_reportdef get_data():"""獲取數據集:return:"""iris = load_iris()return iris.data, iris.targetdef split_data(data, target):"""劃分數據集:param data::param target::return:"""data = np.array(data)target = np.array(target)target = np.reshape(target, (target.shape[0], 1))# 正則化數據,防止數據大小本身對結果造成影響sd = StandardScaler()data = sd.fit_transform(data)# 拼接特征值與類別dataset = np.hstack((data, target))n = dataset.shape[0]# 打亂數據np.random.shuffle(dataset)# 劃分數據集,返回訓練集與測試集train = dataset[:int(0.7 * n), :]test = dataset[int(0.7 * n):, :]return train, testdef sigmoid(z):"""sigmoid函數:param z::return:"""return 1 / (1 + np.exp(-z))def draw_sigmoid():"""畫出sigmoid函數:return:"""fig, ax = plt.subplots()x_data = np.arange(-10, 10, 0.1)ax.plot(x_data, sigmoid(x_data))plt.show()def calCost(dataset, theta):"""計算代價函數:param dataset::param theta::return:"""x = dataset[:, :-1]y = dataset[:, -1:]z = x @ theta.T# 訓練數據個數,或者用m = y.shape[1]m = y.sizepara1 = np.multiply(-y, np.log(sigmoid(z)))para2 = np.multiply((1 - y), np.log(1 - sigmoid(z)))# 代價函數YJ = 1 / m * np.sum(para1 - para2)return Jdef gradient(dataset, theta, iters, alpha):"""梯度下降:param dataset::param theta::param iters::param alpha::return:"""# 存放每次梯度下降后的損失值x = dataset[:, :-1]y = dataset[:, -1:]for i in range(iters):h_x = sigmoid(x @ theta.T)theta = theta - alpha / len(x) * (h_x - y).T @ xreturn thetadef get_per_classify_data(data, i):"""返回第i類的數據:param data:數據集:param i:類別:return:"""return data[data[:, -1] == i]def get_final_theta(data, i, theta, iters, alpha):"""獲取梯度下降后的theta值:param data::param i::param theta::param iters::param alpha::return:"""dataset = get_per_classify_data(data, i)return gradient(dataset, theta, iters, alpha)def predict(dataset, theta_list):"""預測結果:param dataset::param theta_list::return:"""x = dataset[:, :-1]per_theta_list = [i[0] for i in theta_list]per_theta_list = np.array(per_theta_list)per_prob = sigmoid(np.dot(x, per_theta_list.T))# 返回每行最大值所在的索引,即概率最大的類別return np.argmax(per_prob, axis=1)if __name__ == '__main__':plt.rcParams['font.sans-serif'] = 'SimHei' # 黑體plt.rcParams['axes.unicode_minus'] = False # 顯示負號data, target = get_data()train, test = split_data(data, target)draw_sigmoid()iters = 1000 # 迭代次數alpha = 0.5 # 學習率theta_list = []for i in range(data.shape[1]):theta = np.zeros((1, data.shape[1]))theta_list.append(theta)final_theta_list = []target_list = list(set(target))for i in target_list:theta_i = get_final_theta(train, i, theta_list[target_list.index(i)], iters, alpha)final_theta_list.append(theta_i)y_predict = predict(test, final_theta_list)# 查看預測準確度print(classification_report(y_predict, test[:, -1]))3 預測結果
總結
以上是生活随笔為你收集整理的【机器学习】逻辑回归(LogisticRegression)分类鸢尾花的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20172301 2017-2018-2
- 下一篇: 【图像处理】——图像的二值化操作及阈值化