线性回归模型: 二维坐标系中的数学公式是 z = a + bx,高中课本中我们将b称为斜率,a称为截距。所以在二维坐标中线性回归模型是一条直线,因为它包括了一个自变量x,所以叫做一元线性回归。在三维坐标中的数学公式是在三维坐标系中的数学公式是 z=a∗x+b∗y+c,图形是一个平面。因为包括了两个自变量,所以叫做多元线性回归。定义中包括两个或两个以上的自变量的回归模型统一叫做多元线性回归。
线性回归模型代表自变量和因变量之间满足一定的线性关系。生活中在某一定范围内的一些数据之间关系是满足线性回归模型的,如房屋面积和房价、年龄和身高、工作经验和薪酬等等。下面的实例中我们将采用穿糖葫芦的方式一步一步的将所有的功能函数组合起来,最终完成模型的设计。
一、读入数据
read_csv()函数读入数据
def read_data(path):
data=pd.read_csv(path)
return data
原始数据如下
二、可视化数据
def visualize_data(data):
flg=plt.figure(figsize=(6,6),dpi=80)
ax=flg.add_subplot(111)
ax.set_xlabel("职场时间")
#ax.set_xticks(range(1,10,1))
ax.set_ylabel("工资薪水")
#ax.setyticks(range(39000,130000,1000))
ax.scatter(data.YearsExperience,data.Salary,color="b",label="数据分布图")
plt.legend(shadow=True)
plt.show()
三、分析数据
根据上图数据的分布,发现是否有异常值等。
四、标准化
为了模型的收敛速度,将薪水数据按比例缩放,这里采用了Min-Max方法,将薪水映射到[0,1]区间上。
def data_normalization_Min_Max(data):
data1={'price':data['Salary'].tolist()}
price_frame = pd.DataFrame(data1)
min_max_normalizer = preprocessing.MinMaxScaler()
scaled_data = min_max_normalizer.fit_transform(price_frame)
price_frame_normalized = pd.DataFrame(scaled_data)
data['normalize_price']=price_frame_normalized
return data
五、数据预览
def data_preview(data):
print(data.head())
六、数据切割
将数据划分为训练集和测试集
def train_test_random_split(data, test_size=0.2, shuffle=True, random_state=None):
if shuffle:
data = reset(data, random_state=random_state)
train = data[int(len(data)*test_size):].reset_index(drop = True)
test = data[:int(len(data)*test_size)].reset_index(drop = True)
return train,test
七、根据训练数据生成模型
def make_train_data_model(data):
#特征集合
features=['YearsExperience']
#标签集合
labels=['normalize_price']
model=train_ols_model(data[features],data[labels])
return model;
八、模型评估
均方差越接近于0越好,决定系数越接近于1越好。
def evaluate_test_data_model(data,model):
features=['YearsExperience']
labels=['normalize_price']
mse,score=evaluate_model(model,data[features],data[labels])
print("均方差是%f"% mse)
print("决定系数是%f"% score)
visulize_model(model,data[features],data[labels])
九、集成学习
我们训练模型1000次,取1000的斜率a和截距b的平均值
for i in range(1000):
train_data,test_data=train_test_random_split(data)
#使用训练集训练模型
model=make_train_data_model(train_data)
# 记录每一次斜率a的估计值
coefs.append(model.coef_[0][0])
# 记录每一次截距b的估计值
intercepts.append(model.intercept_[0])
十、可视化斜率和截断
def visualize_params(params,mean):
"""
可视化模型参数估计值的分布
"""
# 创建一个图形框
fig = plt.figure(figsize=(6, 6), dpi=80)
# 在图形框里只画一幅图
ax = fig.add_subplot(111)
n, bins, _ = ax.hist(params, bins=10, density=True, color="b",
edgecolor='black', linewidth=1.2, alpha=0.5)
# 用多项式拟合得到的直方图
z1 = np.polyfit(bins[:-1], n, 10)
p1 = np.poly1d(z1)
ax.plot(bins[:-1], p1(bins[:-1]), "r-.")
plt.title('平均值:%.3f'%mean)
plt.show()
画出斜率取值的分布区域
visualize_params(coefs,np.mean(coefs))
画出截距取值的分布区域
visualize_params(intercepts,np.mean(intercepts))
十一、最终得到我们的一元线性回归模型
y=0.112X-0.141