Сделай это сегодня
Сделайте это напрямую
Так же, как и в предыдущем вопросе, мы начинаем непосредственно
код выше
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot as plt
from sklearn.metrics import accuracy_score
# 导入数据及可视化
data = pd.read_csv('task2_data.csv')
data.head()
mask = data.loc[:, 'y'] == 1
print(mask)
fig1 = plt.figure()
plt.ylabel('pay2')
plt.xlabel('pay1')
plt.title('pay1_pay2')
abnormal = plt.scatter(data.loc[:, 'pay1'][mask], data.loc[:, 'pay2'][mask])
normal = plt.scatter(data.loc[:, 'pay1'][~mask], data.loc[:, 'pay2'][~mask])
plt.legend((normal, abnormal), ('normal', 'abnormal'))
plt.show()
x = data.drop(['y'], axis=1)
y = data.loc[:, 'y']
x.head()
y.head()
# 简历模型
LR1 = LogisticRegression()
LR1.fit(x, y)
# 模型预测
y_predict = LR1.predict(x)
print(y_predict, y)
# 预测目标值
# 评估模型
accuracy = accuracy_score(y, y_predict)
print(accuracy)
# 可视化决策边界
theta0 = LR1.intercept_[0]
theta1, theta2 = LR1.coef_[0][0], LR1.coef_[0][1]
print(theta0, theta1, theta2)
x1 = data.loc[:, 'pay1']
x2_new = -(theta0 + theta1 * x1)/theta2
print(x2_new)
fig2 = plt.figure()
plt.ylabel('pay2')
plt.xlabel('pay1')
plt.title('pay1_pay2')
abnormal = plt.scatter(data.loc[:, 'pay1'][mask], data.loc[:, 'pay2'][mask])
normal = plt.scatter(data.loc[:, 'pay1'][~mask], data.loc[:, 'pay2'][~mask])
plt.legend((normal, abnormal), ('normal', 'abnormal'))
plt.plot(x1, x2_new)
plt.show()
Когда я это делаю, я всегда чувствую, что все идет хорошо, пока точность расчета не составляет всего 80% и граница решения не нарисована.
Почему она такая, это всегда кажется немного неправильным
Посмотрим, рисовать так сейчас неразумно, но немного надуманно. Уместнее ли рассмотреть возможность использования квадратичной функции?
Добавьте квадратичный член и снова введите код
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot as plt
from sklearn.metrics import accuracy_score
# 导入数据及可视化
data = pd.read_csv('task2_data.csv')
data.head()
mask = data.loc[:, 'y'] == 1
print(mask)
fig1 = plt.figure()
plt.ylabel('pay2')
plt.xlabel('pay1')
plt.title('pay1_pay2')
abnormal = plt.scatter(data.loc[:, 'pay1'][mask], data.loc[:, 'pay2'][mask])
normal = plt.scatter(data.loc[:, 'pay1'][~mask], data.loc[:, 'pay2'][~mask])
plt.legend((normal, abnormal), ('normal', 'abnormal'))
plt.show()
x = data.drop(['y'], axis=1)
y = data.loc[:, 'y']
x.head()
y.head()
# 简历模型
LR1 = LogisticRegression()
LR1.fit(x, y)
# 模型预测
y_predict = LR1.predict(x)
print(y_predict, y)
# 预测目标值
# 评估模型
accuracy = accuracy_score(y, y_predict)
print(accuracy)
# 可视化决策边界
theta0 = LR1.intercept_[0]
theta1, theta2 = LR1.coef_[0][0], LR1.coef_[0][1]
print(theta0, theta1, theta2)
x1 = data.loc[:, 'pay1']
x2_new = -(theta0 + theta1 * x1) / theta2
print(x2_new)
fig2 = plt.figure()
plt.ylabel('pay2')
plt.xlabel('pay1')
plt.title('pay1_pay2')
abnormal = plt.scatter(data.loc[:, 'pay1'][mask], data.loc[:, 'pay2'][mask])
normal = plt.scatter(data.loc[:, 'pay1'][~mask], data.loc[:, 'pay2'][~mask])
plt.legend((normal, abnormal), ('normal', 'abnormal'))
plt.plot(x1, x2_new)
plt.show()
# 构造二次项
x2 = data.loc[:, 'pay2']
x1_2 = x1 * x1
x2_2 = x2 * x2
x1_x2 = x1 * x2
print(x1_2.shape, x2_2.shape, x1_x2.shape)
# 创建2次分类边界数据
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)
# 模型预测
y_predict2 = LR2.predict(x_new)
print(y)
print(y_predict2)
# 计算准确率
accuracy2 = accuracy_score(y, y_predict2)
print(accuracy2)
# 测试样本预测
x_test = np.array([[80, 20]])
y_predict1_test = LR1.predict(x_test)
print(y_predict1_test)# 老版本预测
print('abnormal' if y_predict1_test==1 else 'normal')
x_test_2 = np.array([[80, 20, 6400, 400, 1600]])
y_predict2_test = LR2.predict(x_test_2)
print(y_predict2_test)# 新版本预测
print('abnormal' if y_predict2_test==1 else 'normal')
# 计算决策边界函数
"""
要把最后得出的theta0,theta0,theta1,theta2,theta3,theta4,theta5
的theta0 + theta1*x1 + theta2*x2 + theta3*x1^2 + theta4*x2^2 +theta5*x1*x2
转换成ax^2 + bx +c = 0的模式
得出
a = theta4
b = theta5*x1 + theta2
c = theta0 + theta1*x1 +theta3*x1*x1
把数据代入就是下面的代码
"""
x1_new_2 = x1.sort_values() # 把x1排序,便于后面画图
theta0 = LR2.intercept_[0]
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],
print(theta0, theta1, theta2, theta3, theta4, theta5)
a = theta4
b = theta5 * x1_new_2 + theta2
c = theta0 + theta1 * x1_new_2 + theta3 * x1_new_2 * x1_new_2
x2_new_2 = (-b + np.sqrt(b * b - 4 * a * c)) / (2 * a)
print(x2_new_2)
# 画出新决策边界
fig3 = plt.figure()
plt.ylabel('pay2')
plt.xlabel('pay1')
plt.title('pay1_pay2')
abnormal = plt.scatter(data.loc[:, 'pay1'][mask], data.loc[:, 'pay2'][mask])
normal = plt.scatter(data.loc[:, 'pay1'][~mask], data.loc[:, 'pay2'][~mask])
plt.legend((normal, abnormal), ('normal', 'abnormal'))
plt.plot(x1_new_2, x2_new_2)
plt.show()
смотри последнюю картинку
Посмотрите на эту картинку еще раз, это не разумно