機器學習——一二階線性迴歸——註釋就是筆記
阿新 • • 發佈:2021-10-22
import pandas as pd import numpy as np from matplotlib import pyplot as plt 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'] ''' 邊界函式: θ0 + θ1X1 + θ2X2 = 0 ————一階 ''' #establish the model and train it from sklearn.linear_model import LogisticRegression LR = LogisticRegression() LR.fit(X,y) # show the predicted result and its accuracy y_predict=LR.predict(X) print(y_predict) from sklearn.metrics import accuracy_score accuracy = accuracy_score(y,y_predict) # test y_test = LR.predict([[70,50]]) print('pass' if y_test==1 else 'failed') theta0 = LR.intercept_ # 截距 theta1,theta2 = LR.coef_[0][0],LR.coef_[0][1] print(theta0,theta1,theta2) ''' 邊界函式: θ0 + θ1X1 + θ2X2 = 0 ————一階 已知常量θ,求X2 目的是為了畫出這條線以便直觀的檢視 ''' X2_new = -(theta0+theta1*X1) / theta2 fig3 = 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,X2_new) plt.title('example1-example2') # 設定表名 plt.xlabel('example1') # 設定X座標軸 plt.ylabel('example2') # 設定Y座標軸 plt.legend((passed, failed), ('passed', 'failed')) plt.show() # 檢視影象 ''' 二階邊界函式:θ0 + θ1X1 + θ2X2 + θ3X1*X1 + Θ4X2*X2 + θ5X1X2 = 0 影象上資料不變,但是要改變曲線才能提高準確率,所以需要創造這些引數 ''' 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() # 檢視影象 #X1必須是有序的,否則不是一條直線 -->104