數(shù)據(jù)集和源碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留下QQ郵箱或者私信
線性回歸是利用最小二乘函數(shù)對(duì)一個(gè)或多個(gè)因變量之間關(guān)系進(jìn)行建模的一種回歸分析,這種函數(shù)是一個(gè)或多個(gè)稱為回歸系數(shù)的模型參數(shù)的線性組合。只有一個(gè)變量的稱為一元回歸,大于一個(gè)變量的情況叫做多元回歸。利用線性回歸,我們可以預(yù)測(cè)一組特定數(shù)據(jù)是否在一定時(shí)期內(nèi)增長(zhǎng)或下降。
接下來(lái)以線性回歸預(yù)測(cè)波士頓房?jī)r(jià)進(jìn)行實(shí)戰(zhàn)解析
線性回歸代碼如下
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# 讀數(shù)據(jù)
data = np.loadtxt(boston_house_price.csv', float, delimiter=",", skiprows=1)
X, y = data[:, :13], data[:, 13]
# Z-score歸一化
for i in range(X.shape[1]):
X[:, i] = (X[:, i] - np.mean(X[:, i])) / np.std(X[:, i])
# 劃分訓(xùn)練集、測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 將訓(xùn)練集、測(cè)試集改為列向量的形式
y_train = y_train.reshape((-1, 1))
y_test = y_test.reshape((-1, 1))
# 初始化模型參數(shù)
def initialize_params(feature_num):
w=np.random.rand(feature_num,1)
b=0
return w,b
def forward(X, y, w, b):
num_train=X.shape[0]
y_hat=np.dot(X,w)+b
loss=np.sum((y_hat-y)**2)/num_train
dw=np.dot(X.T,(y_hat-y))/num_train
db=np.sum((y_hat-y))/num_train
return y_hat,loss,dw,db
# 定義線性回歸模型的訓(xùn)練過(guò)程
def my_linear_regression(X, y, learning_rate, epochs):
loss_his=[]
w,b=initialize_params(X.shape[1])
for i in range(epochs):
y_hat,loss,dw,db=forward(X,y,w,b)
w+=-learning_rate*dw
b+=-learning_rate*db
loss_his.append(loss)
if i%100==0:
print("epochs %d loss %f"%(i,loss))
return loss_his,w,b
# 線性回歸模型訓(xùn)練
loss_his, w, b = my_linear_regression(X_train, y_train, 0.01, 5000)
# 打印loss曲線
plt.plot(range(len(loss_his)), loss_his, linewidth=1, linestyle="solid", label="train loss")
plt.show()
# 打印訓(xùn)練后得到的模型參數(shù)
print("w:", w, "\nb", b)
# 定義MSE函數(shù)
def MSE(y_test, y_pred):
return np.sum(np.square(y_pred - y_test)) / y_pred.shape[0]
# 定義R系數(shù)函數(shù)
def r2_score(y_test, y_pred):
# 測(cè)試集標(biāo)簽均值
y_avg = np.mean(y_test)
# 總離差平方和
ss_tot = np.sum((y_test - y_avg) ** 2)
# 殘差平方和
ss_res = np.sum((y_test - y_pred) ** 2)
# R計(jì)算
r2 = 1 - (ss_res / ss_tot)
return r2
# 在測(cè)試集上預(yù)測(cè)
y_pred = np.dot(X_test, w) + b
# 計(jì)算測(cè)試集的MSE
print("測(cè)試集的MSE: {:.2f}".format(MSE(y_test, y_pred)))
# 計(jì)算測(cè)試集的R方系數(shù)
print("測(cè)試集的R2: {:.2f}".format(r2_score(y_test, y_pred)))
損失值隨訓(xùn)練次數(shù)的變化圖如下 可以看出符合肘部方法?
?
?接下來(lái)可視化分析影響房?jī)r(jià)的因素
""" 各個(gè)字段的含義: ????CRIM?????犯罪率 ????ZN???????住宅用地所占比例 ????INDUS????城鎮(zhèn)中非商業(yè)用地所占比例 ????CHAS?????是否處于查爾斯河邊 ????NOX??????一氧化碳濃度 ????RM???????住宅房間數(shù) ????AGE??????1940年以前建成的業(yè)主自住單位的占比 ????DIS??????距離波士頓5個(gè)商業(yè)中心的加權(quán)平均距離 ????RAD??????距離高速公路的便利指數(shù) ????TAX??????不動(dòng)產(chǎn)權(quán)稅 ????PTRATIO??學(xué)生/教師比例 ????B????????黑人比例 ????LSTAT????低收入階層占比 ????MEDV?????房?jī)r(jià)中位數(shù) """
可視化結(jié)果如下?
?
?
?
?可視化部分代碼如下文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-812623.html
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df=pd.read_csv(boston_house_price.csv',encoding='utf-8')
print(df.head())
df.describe()
df['medv'].hist()
sns.boxplot(x=df['medv'])#有點(diǎn)問(wèn)題 要加個(gè)x傳參
plt.scatter(df['rm'],df['medv'])
def box_plot_outliers(df,s):
q1,q3=df[s].quantile(0.25),df[s].quantile(0.75)
iqr=q3-q1
low,up=q1-1.5*iqr,q3+1.5*iqr
df=df[(df[s]>up)|(df[s]<low)]
return df
df_filter=box_plot_outliers(df,'rm')
df_filter.mean()
plt.scatter(df['dis'],df['medv'])
plt.scatter(df['rad'],df['medv'])
plt.scatter(df['b'],df['medv'])
df.corr()
plt.style.use({'figure.figsize':(15,10)})
df.hist(bins=15)
sns.boxplot(data=df)
plt.figure(figsize=(12,22))
for i in range(13):
plt.subplot(4,4,(i+1))
plt.scatter(df.iloc[:,i],df['medv'])
plt.title('{}-price scatter'.format(df.columns[i]))
plt.xlabel(df.columns[i])
plt.ylabel('boston house price')
plt.show()
plt.tight_layout()
數(shù)據(jù)集和源碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留下QQ郵箱或者私信文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-812623.html
到了這里,關(guān)于機(jī)器學(xué)習(xí)之利用線性回歸預(yù)測(cè)波士頓房?jī)r(jià)和可視化分析影響房?jī)r(jià)因素實(shí)戰(zhàn)(python實(shí)現(xiàn) 附源碼 超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!