一、正则化
变量过多或过少时,都会出现拟合偏差的问题(欠拟合、过度拟合),当出现过度拟合情况时,可以使用正则化的办法,保留所有变量,在假设函数中加入惩罚项,使theta[i]的值骤降接近于0.
二、实现正则化逻辑回归
导入数据包。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as opt #提供高级函数库
数据集处理,并画出散点图,初步观测此散点图的拟合曲线为圆。
path = "E:\\Pycharm\\workspace\\ex2_Andrew\\ex2data2.txt"
data = pd.read_csv(path,header=None,names=['Test 1','Test 2','Accepted'])
positive = data[data['Accepted'].isin([1])]
negative = data[data['Accepted'].isin([0])]
fig,ax = plt.subplots(figsize=(8,6)) #逻辑回归只适合线性分割,此数据集不适合直接使用逻辑回归
ax.scatter(positive['Test 1'],positive['Test 2'],s=50,c='b',marker='o',label='Accepted')
ax.scatter(negative['Test 1'],negative['Test 2'],s=50,c='r',marker='x',label='Rejected')
ax.legend()
ax.set_xlabel('Test 1 score')
ax.set_ylabel('Test 2 score')
逻辑回归的线性函数模拟在此处不适用,一个更好的办法是增加x变量的数目,创造更多的特征。处理之后的数据集变为29列,删除原有数据的两列,得到新的拥有多个特征的数据集。
degree = 6 #为每组数据提供更高次幂的特征
x1 = data['Test 1']
x2 = data['Test 2']
data.insert(3,'ones',1)
for i in range(1,degree+1): #循环六次,从1到6