1. 程式人生 > 其它 >機器學習—迴歸2-1(簡單線性迴歸)

機器學習—迴歸2-1(簡單線性迴歸)

使用簡單線性迴歸根據年齡預測醫療費用

主要步驟流程:

  • 1. 匯入包
  • 2. 匯入資料集
  • 3. 資料預處理
    • 3.1 檢測缺失值
    • 3.2 篩選資料
    • 3.3 得到自變數和因變數
    • 3.4 拆分訓練集和測試集
  • 4. 構建不同引數的簡單線性迴歸模型
    • 4.1 模型1:構建簡單線性迴歸模型
      • 4.1.1 構建簡單線性迴歸模型
      • 4.1.2 得到模型線性表示式
      • 4.1.3 預測測試集
      • 4.1.4 得到模型MSE
      • 4.1.5 視覺化測試集
    • 4.2 模型2:構建簡單線性迴歸模型
    • 4.3 模型3:構建簡單線性迴歸模型
  資料集連結:https://www.heywhale.com/mw/dataset/622f22298a84f900178aa6a3/file
 

1. 匯入包

In [2]:
# 匯入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

 

2. 匯入資料集

In [3]:
# 匯入資料集
data = pd.read_csv('insurance.csv')
data.head(5)
Out[3]:
  age sex bmi children smoker region charges
0 19 female 27.900
0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
 

3. 資料預處理

3.1 檢測缺失值

In [4]:
# 檢測缺失值
null_df = data.isnull().sum()
null_df
Out[4]:
age         0
sex         0
bmi         0
children    0
smoker      0
region      0
charges     0
dtype: int64

3.2 篩選資料

In [5]:
# 畫出age和charges的散點圖
plt.figure()
plt.scatter(data['age'], data['charges'])
plt.title('Charges vs Age (Origin Dataset)')
plt.show()
In [6]:
# 篩選資料
new_data_1 = data.query('age<=40 & charges<=10000') # 40歲以下 且 10000元以下
new_data_2 = data.query('age>40 & age<=50 & charges<=12500') # 40歲至50歲之間 且 12500元以下
new_data_3 = data.query('age>50 & charges<=17000') # 50歲以上 且 17000元以下
new_data = pd.concat([new_data_1, new_data_2, new_data_3], axis=0)
In [7]:
# 畫出age和charges的散點圖
plt.figure()
plt.scatter(new_data['age'], new_data['charges'])
plt.title('Charges vs Age (Filtered Dataset)')
plt.show()
In [8]:
# 檢查age和charges的相關性
print('age和charges的相關性是:\n', np.corrcoef(new_data['age'], new_data['charges']))
age和charges的相關性是:
 [[1.         0.97552029]
 [0.97552029 1.        ]]

3.3 得到自變數和因變數

In [9]:
# 得到自變數和因變數
x = new_data.iloc[:, 0:1].values
y = new_data['charges'].values

3.4 拆分訓練集和測試集

In [10]:
# 拆分訓練集和測試集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 1)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)
(772, 1)
(194, 1)
(772,)
(194,)
 

4. 構建不同引數的簡單線性迴歸模型

4.1 模型1:構建簡單線性迴歸模型

4.1.1 構建簡單線性迴歸模型

In [11]:
# 構建不同引數的簡單線性迴歸模型
# 模型1:構建線性迴歸模型(normalize = True, fit_intercept = True)
from sklearn.linear_model import LinearRegression
regressor = LinearRegression(normalize = True, fit_intercept = True)
regressor.fit(x_train, y_train)
Out[11]:
LinearRegression(normalize=True)

4.1.2 得到模型線性表示式

In [12]:
# 得到線性表示式: Charges = a * Age + b
print('Charges = %.2f * Age + (%.2f)' %(regressor.coef_, regressor.intercept_))
Charges = 266.97 * Age + (-3461.37)

4.1.3 預測測試集

In [13]:
# 預測測試集
y_pred = regressor.predict(x_test)

4.1.4 得到模型MSE

In [14]:
# 得到模型的MSE
from sklearn.metrics import mean_squared_error
mse_score = mean_squared_error(y_test, y_pred)
print('簡單線性迴歸模型的MSE是:%.2f' %(mse_score)) # 738,002.02
簡單線性迴歸模型的MSE是:738002.02

4.1.5 視覺化測試集

In [15]:
# 視覺化測試集
plt.scatter(x_test, y_test, color = 'red')
plt.plot(x_test, y_pred, color = 'blue')
plt.title('Charges vs Age (Test set)')
plt.xlabel('Age')
plt.ylabel('Charges')
plt.show()

4.2 模型2:構建簡單線性迴歸模型

In [16]:
# 模型2:構建線性迴歸模型(normalize = False, fit_intercept = True)
regressor = LinearRegression(normalize = False, fit_intercept = True)
regressor.fit(x_train, y_train)
Out[16]:
LinearRegression()
In [17]:
# 得到線性表示式: Charges = a * Age + b
print('Charges = %.2f * Age + (%.2f)' %(regressor.coef_, regressor.intercept_))
Charges = 266.97 * Age + (-3461.37)
In [18]:
# 預測測試集
y_pred = regressor.predict(x_test)
In [19]:
# 得到模型的MSE
mse_score = mean_squared_error(y_test, y_pred)
print('簡單線性迴歸模型的MSE是:%.2f' %(mse_score)) # 738,002.02
簡單線性迴歸模型的MSE是:738002.02
In [20]:
# 視覺化測試集
plt.scatter(x_test, y_test, color = 'red')
plt.plot(x_test, y_pred, color = 'blue')
plt.title('Charges vs Age (Test set)')
plt.xlabel('Age')
plt.ylabel('Charges')
plt.show()

4.3 模型3:構建簡單線性迴歸模型

In [21]:
# 模型3:構建線性迴歸模型(normalize = False, fit_intercept = False)
regressor = LinearRegression(normalize = False, fit_intercept = False)
regressor.fit(x_train, y_train)
Out[21]:
LinearRegression(fit_intercept=False)
In [22]:
# 得到線性表示式: Charges = a * Age + b
print('Charges = %.2f * Age' %(regressor.coef_))
Charges = 188.91 * Age
In [23]:
regressor.intercept_
Out[23]:
0.0
In [24]:
# 預測測試集
y_pred = regressor.predict(x_test)
In [25]:
# 得到模型的MSE
mse_score = mean_squared_error(y_test, y_pred)
print('簡單線性迴歸模型的MSE是:%.2f' %(mse_score)) # 2,404,889.50
簡單線性迴歸模型的MSE是:2404889.50
In [26]:
# 視覺化測試集預測結果
plt.scatter(x_test, y_test, color = 'red')
plt.plot(x_test, y_pred, color = 'blue')
plt.title('Charges vs Age (Test set)')
plt.xlabel('Age')
plt.ylabel('Charges')
plt.show()
 

結論: 1)由上圖可見,模型為樣本點擬合了一條直線;

            2)傳入模型不同的引數,模型的效能不同;