線性回歸模型-----薪酬和工作經驗之間的關系
線性回歸模型: 二維坐標系中的數學公式是 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