機器學習——圓形線性迴歸——註釋就是筆記
阿新 • • 發佈:2021-10-22
import pandas as pd import numpy as np from matplotlib import pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score def f(x): a = theta4 b = theta5 * X1_new + theta2 c = theta0 + theta1 * x + theta3 * x * x 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 if __name__ == '__main__': ''' 邏輯迴歸 ''' # load the data data = pd.read_csv('') data.head() ''' 第一次檢視所有資料 ''' # visualize the data fig1 = plt.figure() plt.scatter(data.loc[:,'example1'], data.loc[:, 'example2']) # .......匯入資料 plt.title('example1-example2') # 設定表名 plt.xlabel('example1') # 設定X座標軸 plt.ylabel('example2') # 設定Y座標軸 plt.show() # 檢視影象 ''' 第二次檢視帶有正確錯誤標識的資料 ''' # add label mask mask = data.loc[:, 'pass'] == 1 fig2= plt.figure() passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask]) # .......匯入資料 failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask]) # .......匯入資料 plt.title('example1-example2') # 設定表名 plt.xlabel('example1') # 設定X座標軸 plt.ylabel('example2') # 設定Y座標軸 plt.legend((passed, failed), ('passed', 'failed')) plt.show() # 檢視影象 # define X,Y X = data.drop(['pass'], axis=1) y = data.loc[:, 'pass'] y.head # 檢視資料 X1 = data.loc[:, 'example1'] X2 = data.loc[:, 'example2'] 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) # 建立新的訓練 LR2 = LogisticRegression() LR2.fit(X_new, y) y2_predict = LR2.predict(X_new) # 預測 accuracy2 = accuracy_score(y, y2_predict) print(accuracy2) X1_new = X1.sort_values() # 從小到大排序 theta0 = LR2.intercept_ theta1, theta2, theta3, theta4, theta5 = LR2.coef_[0][0], LR2.coef_[0][1], LR2.coef_[0][2], LR2.coef_[0][3], \ LR2.coef_[0][4] # 製作曲線引數 a = theta4 b = theta5 * X1_new + theta2 c = theta0 + theta1 * X1_new + theta3 * X1_new * X1_new X2_new_boundary = (-b + np.sqrt(b * b - 4 * a * c)) / (2 * a) fig4 = plt.figure() passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask]) # .......匯入資料 failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask]) # .......匯入資料 plt.plot(X1_new, X2_new_boundary) plt.title('example1-example2') # 設定表名 plt.xlabel('example1') # 設定X座標軸 plt.ylabel('example2') # 設定Y座標軸 plt.legend((passed, failed), ('passed', 'failed')) plt.show() # 檢視影象 ''' 如果在這裡使用二階線性迴歸,那麼只有一半的資料能被隔離開 也就是說忽略了X的第二種結果 接下來就是加上這種結果的第二條曲線 ''' ''' 正確方法 ''' # define f(x) --> 8 X2_new_boundary1 = [] X2_new_boundary2 = [] for x in X1_new: X2_new_boundary1.append(f(x)[0]) X2_new_boundary2.append(f(x)[1]) print(X2_new_boundary1, X2_new_boundary2) fig5 = plt.figure() passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask]) # .......匯入資料 failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask]) # .......匯入資料 plt.plot(X1_new, X2_new_boundary1) plt.plot(X1_new, X2_new_boundary2) plt.title('example1-example2') # 設定表名 plt.xlabel('example1') # 設定X座標軸 plt.ylabel('example2') # 設定Y座標軸 plt.legend((passed, failed), ('passed', 'failed')) plt.show() # 檢視影象 ''' 你會發現雖然你補上了另外一個X值,但是兩個X對應的曲線並沒有連在一起 這是因為數之間本來就是有間隔的,不全,所以連不上,這時候需要我們把他補全 ''' X1_range = [-0.9 + x / 10000 for x in range(0, 19000)] X1_range = np.array(X1_range) X2_new_boundary1 = [] X2_new_boundary2 = [] for x in X1_new: X2_new_boundary1.append(f(x)[0]) X2_new_boundary2.append(f(x)[1]) fig5 = plt.figure() passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask]) # .......匯入資料 failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask]) # .......匯入資料 plt.plot(X1_range, X2_new_boundary1) plt.plot(X1_range, X2_new_boundary2) plt.title('example1-example2') # 設定表名 plt.xlabel('example1') # 設定X座標軸 plt.ylabel('example2') # 設定Y座標軸 plt.legend((passed, failed), ('passed', 'failed')) plt.show() # 檢視影象