資料集:https://www.123pan.com/s/RbfGjv-vOem3.html
提取碼:rgzn
一、邏輯迴歸-預測考試透過
1、匯入模組
# 匯入模組
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
``
## 2、讀取資料
```python
# 讀取資料(載入資料,載入後列印首幾行確認資料載入成功。)
data = pd.read_csv('../data/examdata.csv')
data.head() # 列印前幾行
3、視覺化資料
# 視覺化資料
# 以Exam1為x軸,Exam2為y軸,繪製散點圖
fig1 = plt.figure()
plt.scatter(data.loc[:, 'Exam1'], data.loc[:, 'Exam2'])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.show()
4、新增標籤標記
標籤標記的作用是,將透過考試的記錄標記為True,未透過考試的記錄標記為False。方便對透過和未透過的資料進行分離。
# 新增標籤標記
mask = data.loc[:, 'Pass'] == 1
# 這個比較操作的結果是一個布林向量(Boolean Series),其中的值為 True 當對應的 'Pass' 值等於1,否則為 False。
# 這個布林向量被賦值給變數 mask,通常用於後續的條件過濾或標記。
print(~mask)
# ~是對布林向量取反
5、將有標記的標籤資料視覺化
# 將有標記的標籤資料視覺化
fig2 = plt.figure()
passed = plt.scatter(data.loc[:, 'Exam1'][mask], data.loc[:, 'Exam2'][mask])
# 在新建立的圖形上繪製一個散點圖,其中x軸是data DataFrame中透過mask篩選出的'Exam1'列的值,y軸是其對應的'Exam2'列的值。
# 這些點代表的是'Pass'列值為1的行,即透過的考試記錄。
# 使用passed變數來儲存這個散點圖物件,以便在圖例中顯示。
failed = plt.scatter(data.loc[:, 'Exam1'][~mask], data.loc[:, 'Exam2'][~mask])
# 同理failed為未透過考試的散點圖
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
# 新增圖例,passed和failed是之前散點圖的物件,而('passed','failed')是對應圖例中的文字標籤。
plt.legend((passed, failed), ('passed', 'failed'))
plt.show()
6、定義X、y
# 定義 X,y
X = data.drop(['Pass'], axis=1)
# drop方法用於移除指定的列。['Pass']表示要移除的列名,axis=1表示移除列,預設是移除行。
# 所以X就是data DataFrame中除了'Pass'列的所有列。
y = data.loc[:, 'Pass'] # y為data DataFrame中'Pass'列
X1 = data.loc[:, 'Exam1'] # X1為data DataFrame中'Exam1'列
X2 = data.loc[:, 'Exam2'] # X2為data DataFrame中'Exam2'列
print(X1.head()) # 列印X1的前幾行
print(X.shape, y.shape) # 列印X和y的形狀
# X和y的形狀:(100, 2) (100,)
7、建立並訓練模型
# 建立並訓練模型
LR = LogisticRegression() # 建立邏輯迴歸模型
LR.fit(X, y) # 訓練模型
8、預測結果並評估模型
預測結果
# 預測結果
y_predict = LR.predict(X) # 預測結果
print(y_predict)
預測結果如下:
[0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1
1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1
1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1]
計算準確率
# 計算準確率
accuracy = accuracy_score(y, y_predict) # 計算準確率
print(accuracy) # 0.89
預測exam1=70,exam2=65是否透過
# 預測所給的資料是否透過 exam1=70,exam2=65
y_test = LR.predict([[70, 65]])
print('passed' if y_test == 1 else 'failed') # passed
9、計算決策邊界
迴歸模型其實就是一個函式。例如f(x)=theta0+theta1x1+theta2x2
對於這個函式來說,theta0就是它的截距,theta1和theta2就是係數,或者說權重。
邊界函式:theta0+theta1x1+theta2x2=0
對函式變形得x2=-(theta0+theta1*x1)/theta2
迴歸模型建立好後,theta、theta1、theta2就已經確定了。
邊界函式就是關於x1和x2的函式。每給定一個x1,就有一個x2與之對應;把X1作為應變數,就可以計算出X2_new。
X1中的一個值,對應的X2_new的一個值,確定一個點,將這些點連起來,就繪製出邊界函式。
獲取theta並計算決策邊界
係數theta儲存在coef_中
# LR2.coef_中存放的是模型的係數,或者說權重。
# print(LR.coef_) # [[0.20535491 0.2005838 ]]
# 獲取theta0,theta1,theta2
theta0 = LR.intercept_ # 截距項
theta1, theta2 = LR.coef_[0][0], LR.coef_[0][1] # 'Exam1' 和 'Exam2' 的特徵權重。
print(theta0, theta1, theta2) # [-25.05219314] 0.205354912177904 0.2005838039546907
# 以X1作為應變數,計算X2_new。
X2_new = -(theta0 + theta1 * X1) / theta2
print(X2_new)
X2_new的結果:
0 89.449169
1 93.889277
2 88.196312
3 63.282281
4 43.983773
...
95 39.421346
96 81.629448
97 23.219064
98 68.240049
99 48.341870
Name: Exam1, Length: 100, dtype: float64
10、繪製決策邊界
# 視覺化邊界函式
fig3 = plt.figure()
passed = plt.scatter(data.loc[:, 'Exam1'][mask], data.loc[:, 'Exam2'][mask]) # 透過
failed = plt.scatter(data.loc[:, 'Exam1'][~mask], data.loc[:, 'Exam2'][~mask]) # 未透過
plt.plot(X1, X2_new) # 繪製邊界函式
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed, failed), ('passed', 'failed')) # 新增圖例
plt.show()
二、邏輯迴歸-晶片質量檢測
1、匯入模組
# 匯入模組
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np
2、載入資料集
#載入資料
import pandas as pd
data = pd.read_csv('../data/chip_test.csv')
print(data)
3、新增標記
#新增標記
mask = data.loc[:,'pass']==1
print(mask)
4、視覺化有標記的資料
#視覺化有標記的資料
import matplotlib.pyplot as plt
fig1 = plt.figure()
passed = plt.scatter(data.loc[:,'test1'][mask],data.loc[:,'test2'][mask])
failed = plt.scatter(data.loc[:,'test1'][~mask],data.loc[:,'test2'][~mask])
plt.title('test1-test2')
plt.xlabel('test1')
plt.ylabel('test2')
plt.legend((passed,failed),('passed','failed'))
plt.show()
5、定義X、y
#定義 X,y
X = data.drop(['pass'],axis=1) # x為test1和test2兩列
y = data.loc[:,'pass'] # y為pass列
X1 = data.loc[:,'test1']
X2 = data.loc[:,'test2']
X1.head()
#create new data
# 增加二次項特徵
X1_2 = X1*X1
X2_2 = X2*X2
X1_X2 = X1*X2
X_new = {'X1':X1,'X2':X2,'X1_2':X1_2,'X2_2':X2_2,'X1_X2':X1_X2}
X_new = pd.DataFrame(X_new)
print(X_new)
6、建立並訓練模型
#建立並訓練模型
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression()
LR.fit(X_new,y)
7、評估模型
#評估模型表現
y_predict = LR.predict(X_new) # 使用訓練好的模型預測
# 計算準確率
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
print(accuracy) # 0.8135593220338984
8、初步畫決策邊界
#初步畫決策邊界
# 對X1進行排序
X1_new = X1.sort_values()
# 獲取theta
theta0 = LR.intercept_
theta1,theta2,theta3,theta4,theta5 = LR.coef_[0][0],LR.coef_[0][1],LR.coef_[0][2],LR.coef_[0][3],LR.coef_[0][4]
# 計算a、b、c
a = theta4
b = theta5*X1_new+theta2
c = theta0+theta1*X1_new+theta3*X1_new*X1_new
# 計算X2_new_boundary
X2_new_boundary = (-b+np.sqrt(b*b-4*a*c))/(2*a)
# 繪製決策邊界
fig2 = plt.figure()
passed = plt.scatter(data.loc[:,'test1'][mask],data.loc[:,'test2'][mask])
failed = plt.scatter(data.loc[:,'test1'][~mask],data.loc[:,'test2'][~mask])
plt.plot(X1_new,X2_new_boundary)
plt.title('test1-test2')
plt.xlabel('test1')
plt.ylabel('test2')
plt.legend((passed,failed),('passed','failed'))
plt.show()
9、畫完整的決策邊界
plt.show()
#%%
#畫完整的決策邊界
import numpy as np
d = np.array(b*b-4*a*c) # 判別式deta(拼音)
#d = (-b+np.sqrt(b*b-4*a*c))/(2*a)
X1_new
#print(np.array(d))
定義f(x)用於計算上邊界和下邊界
#define f(x)
def f(x):
"""
用於計算上下邊界。
函式返回兩個值,分別是基於輸入x計算出的兩個可能的X2邊界值。
"""
a = theta4
b = theta5*x+theta2
c = theta0+theta1*x+theta3*x*x
# 方程a*x**2+b*x+c=0的兩個根
X2_new_boundary1 = (-b+np.sqrt(b*b-4*a*c))/(2*a) # 上邊界
X2_new_boundary2 = (-b-np.sqrt(b*b-4*a*c))/(2*a) # 下邊界
return X2_new_boundary1,X2_new_boundary2
計算上下邊界
# 計算上下邊界
# 列表用於儲存上下邊界的值
X2_new_boundary1 = []
X2_new_boundary2 = []
# 取出x中的每個值,計算出對應的上、下邊界
for x in X1_new:
X2_new_boundary1.append(f(x)[0]) # X2_new_boundary1
X2_new_boundary2.append(f(x)[1]) # X2_new_boundary2
print(X2_new_boundary1,X2_new_boundary2)
視覺化決策邊界
# 視覺化決策邊界
fig3 = plt.figure()
passed=plt.scatter(data.loc[:,'test1'][mask],data.loc[:,'test2'][mask])
failed=plt.scatter(data.loc[:,'test1'][~mask],data.loc[:,'test2'][~mask])
plt.plot(X1_new,X2_new_boundary1) # 上邊界
plt.plot(X1_new,X2_new_boundary2) # 下邊界
plt.title('test1-test2')
plt.xlabel('test1')
plt.ylabel('test2')
plt.legend((passed,failed),('passed','failed'))
plt.show()
10、在更密集的座標中畫決策邊界
#在更密集的座標中
X1_range = [-0.9 + x/10000 for x in range(0,19000)]
X1_range = np.array(X1_range) # 轉換為NumPy陣列,計算更高效
X2_new_boundary1 = []
X2_new_boundary2 = []
for x in X1_range:
X2_new_boundary1.append(f(x)[0])
X2_new_boundary2.append(f(x)[1])
視覺化
# coding:utf-8
import matplotlib as mlp
mlp.rcParams['font.family'] = 'SimHei' # 設定字型為簡體黑體
mlp.rcParams['axes.unicode_minus'] = False # 警用負號
fig4 = plt.figure()
passed=plt.scatter(data.loc[:,'test1'][mask],data.loc[:,'test2'][mask])
failed=plt.scatter(data.loc[:,'test1'][~mask],data.loc[:,'test2'][~mask])
# 上下決策邊界,紅色
plt.plot(X1_range,X2_new_boundary1,'r')
plt.plot(X1_range,X2_new_boundary2,'r')
plt.title('test1-test2')
plt.xlabel('測試1')
plt.ylabel('測試2')
plt.title('晶片質量預測')
plt.legend((passed,failed),('passed','failed'))
plt.show()
三、邏輯迴歸-鳶尾花
1、讀取鳶尾花資料集
sklearn模組中就有鳶尾花資料集。
# 讀取鳶尾花資料集
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[iris.target < 2][:, :2] # 只取前兩個特徵、前兩標籤的資料
y = iris.target[iris.target < 2] # 只取0和1標籤(前兩類)
print(X, y)
X1 = X[:, 0]
X2 = X[:, 1]
print(X1)
print(X2)
2、視覺化資料集
# 視覺化
from matplotlib import pyplot as plt
fig1 = plt.figure()
plt.scatter(X1, X2, c=y)
plt.show()
3、建立迴歸模型並訓練
# 建立邏輯迴歸模型,並訓練
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression()
LR.fit(X,y)
4、預測和評估模型
# 預測和評估
y_predict = LR.predict(X)
print(y_predict)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict) # 計算準確率
print(accuracy) # 精確率=1,擬合效果很好
5、計算決策邊界
# 計算決策邊界
theta0 = LR.intercept_
theta1, theta2 = LR.coef_[0][0], LR.coef_[0][1]
X2_new = (-theta0 - theta1 * X1) / theta2
print(X2_new)
6、視覺化決策邊界
# 畫出決策邊界
fig2 = plt.figure()
plt.scatter(X1, X2, c=y)
plt.plot(X1,X2_new)
plt.show()
四、邏輯迴歸知識點
邊界函式