MLP实现波士顿房屋价格回归任务

1. 数据集

波士顿房屋价格.csv文件,文件中的数据有可能不完整,部分数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CRIM, ZN ,INDUS ,CHAS,NOX,RM,AGE,DIS,RAD,TAX,PTRATIO,LSTAT,MEDV
0.00632,18,2.31,0,0.538,6.575,65.2,4.09,1,296,15.3,4.98,24
0.02731,0,7.07,0,0.469,6.421,78.9,4.9671,2,242,17.8,9.14,21.6
0.02729,0,7.07,0,0.469,7.185,61.1,4.9671,2,242,17.8,4.03,34.7
0.03237,0,2.18,0,0.458,6.998,45.8,6.0622,3,222,18.7,2.94,33.4
0.06905,0,2.18,0,0.458,7.147,54.2,6.0622,3,222,18.7,5.33,36.2
0.02985,0,2.18,0,0.458,6.43,58.7,6.0622,3,222,18.7,5.21,28.7
0.08829,12.5,7.87,0,0.524,6.012,66.6,5.5605,5,311,15.2,12.43,22.9
0.14455,12.5,7.87,0,0.524,6.172,96.1,5.9505,5,311,15.2,19.15,27.1
0.21124,12.5,7.87,0,0.524,5.631,100,6.0821,5,311,15.2,29.93,16.5
0.17004,12.5,7.87,0,0.524,6.004,85.9,6.5921,5,311,15.2,17.1,18.9
0.22489,12.5,7.87,0,0.524,6.377,94.3,6.3467,5,311,15.2,20.45,15
0.11747,12.5,7.87,0,0.524,6.009,82.9,6.2267,5,311,15.2,13.27,18.9
0.09378,12.5,7.87,0,0.524,5.889,39,5.4509,5,311,15.2,15.71,21.7
...

  

2. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import numpy as np
 
class MlpRegressor:
    def __init__(self, input_size, hidden_size1, hidden_size2, output_size, learning_rate=0.000001):
        self.input_size = input_size
        self.hidden_size1 = hidden_size1
        self.hidden_size2 = hidden_size2
        self.output_size = output_size
        self.learning_rate = learning_rate
         
        self.W1 = np.random.randn(input_size, hidden_size1) * 0.01
        self.b1 = np.zeros((1, hidden_size1))
        self.W2 = np.random.randn(hidden_size1, hidden_size2) * 0.01
        self.b2 = np.zeros((1, hidden_size2))
        self.W3 = np.random.randn(hidden_size2, output_size) * 0.01
        self.b3 = np.zeros((1, output_size))
     
    def relu(self, x):
        return np.maximum(x, 0)
     
    def relu_derivative(self, x):
        return np.where(x > 0, 1, 0)
     
    def forward(self, X):
        self.Z1 = np.dot(X, self.W1) + self.b1
        self.A1 = self.relu(self.Z1)
        self.Z2 = np.dot(self.A1, self.W2) + self.b2
        self.A2 = self.relu(self.Z2)
        self.Z3 = np.dot(self.A2, self.W3) + self.b3
        self.A3 = self.Z3
        return self.A3
     
    def backward(self, X, y):
        m = X.shape[0]
        dA3 = self.A3 - y
        dZ3 = dA3 * 1
        dW3 = np.dot(self.A2.T, dZ3) / m
        db3 = np.sum(dZ3, axis=0, keepdims=True) / m
        dA2 = np.dot(dZ3, self.W3.T)
        dZ2 = dA2 * self.relu_derivative(self.Z2)
        dW2 = np.dot(self.A1.T, dZ2) / m
        db2 = np.sum(dZ2, axis=0, keepdims=True) / m
        dA1 = np.dot(dZ2, self.W2.T)
        dZ1 = dA1 * self.relu_derivative(self.Z1)
        dW1 = np.dot(X.T, dZ1) / m
        db1 = np.sum(dZ1, axis=0, keepdims=True) / m
         
        # Update weights and biases
        self.W3 -= self.learning_rate * dW3
        self.b3 -= self.learning_rate * db3
        self.W2 -= self.learning_rate * dW2
        self.b2 -= self.learning_rate * db2
        self.W1 -= self.learning_rate * dW1
        self.b1 -= self.learning_rate * db1
     
    def train(self, X, y, epochs=100000, batch_size=64):
        m = X.shape[0]
        for epoch in range(epochs):
            for i in range(0, m, batch_size):
                X_batch = X[i:i+batch_size]
                y_batch = y[i:i+batch_size]
                 
                # Forward propagation
                y_pred = self.forward(X_batch)
                 
                # Backward propagation
                self.backward(X_batch, y_batch)
             
            if (epoch+1) % 1000 == 0:
                loss = np.mean((y - self.forward(X)) ** 2)
                print(f'Epoch {epoch+1}/{epochs}, Loss: {loss}')
 
    def predict(self, X):
        return self.forward(X)
 
 
if __name__ == '__main__':
    import pandas as pd
    from sklearn.model_selection import train_test_split
 
    # 从CSV文件加载数据
    data = pd.read_csv('C:\\Users\\zhang\\Desktop\\AI 框架\\作业\\第一次作业\\boston.csv')
 
    # 提取特征和目标变量
    X = data.drop('MEDV', axis=1# 特征
    y = data['MEDV'# 目标变量
 
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    X_train = X_train.values.reshape(-1, 12)
    y_train = y_train.values.reshape(-1, 1)
    X_test = X_test.values.reshape(-1, 12)  
    y_test = y_test.values.reshape(-1, 1)  
    # 定义神经网络的参数
    input_size = X_train.shape[1# 输入层大小
    hidden_size1 = 64  # 隐藏层大小
    hidden_size2 = 32  # 隐藏层大小
    output_size = 1  # 输出层大小
     
    regressor_model = MlpRegressor(input_size, hidden_size1, hidden_size2, output_size)
    regressor_model.train(X_train, y_train)
 
    y_pred = regressor_model.predict(X_test)   
    print(y_pred)  

  

3. 运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
------------------------------- Training -------------------------------
Epoch 1000/100000, Loss: 215.62193437067899
Epoch 2000/100000, Loss: 192.23747827864736
Epoch 3000/100000, Loss: 126.98647196839126
Epoch 4000/100000, Loss: 104.56790587428584
Epoch 5000/100000, Loss: 93.55895944555557
Epoch 6000/100000, Loss: 81.83677659220027
Epoch 7000/100000, Loss: 69.98101706862538
Epoch 8000/100000, Loss: 60.4438306323673
Epoch 9000/100000, Loss: 54.275051269137215
Epoch 10000/100000, Loss: 50.144528058278446
Epoch 11000/100000, Loss: 46.71168138687022
Epoch 12000/100000, Loss: 44.091385588842066
Epoch 13000/100000, Loss: 41.98703195048573
Epoch 14000/100000, Loss: 40.32358336326167
Epoch 15000/100000, Loss: 38.920320023943574
Epoch 16000/100000, Loss: 37.66334430017403
Epoch 17000/100000, Loss: 36.57507989257117
Epoch 18000/100000, Loss: 35.6136438473766
Epoch 19000/100000, Loss: 34.7649982576941
Epoch 20000/100000, Loss: 33.94940895608493
Epoch 21000/100000, Loss: 33.16146768674789
Epoch 22000/100000, Loss: 32.395166297024666
Epoch 23000/100000, Loss: 31.600705371799602
Epoch 24000/100000, Loss: 30.804917947962632
Epoch 25000/100000, Loss: 29.974635196398847
Epoch 26000/100000, Loss: 29.20624305663592
Epoch 27000/100000, Loss: 28.35745827864321
Epoch 28000/100000, Loss: 27.602636238259457
Epoch 29000/100000, Loss: 26.81650819310092
Epoch 30000/100000, Loss: 26.002914608193542
Epoch 31000/100000, Loss: 25.325440117147213
Epoch 32000/100000, Loss: 24.65334725693612
Epoch 33000/100000, Loss: 24.060109198505522
Epoch 34000/100000, Loss: 23.54033990229176
Epoch 35000/100000, Loss: 23.10805183197649
Epoch 36000/100000, Loss: 22.760178305933966
Epoch 37000/100000, Loss: 22.43516727905778
Epoch 38000/100000, Loss: 22.107765200437264
Epoch 39000/100000, Loss: 21.965537775136905
Epoch 40000/100000, Loss: 21.989661009199523
Epoch 41000/100000, Loss: 21.62034576184785
Epoch 42000/100000, Loss: 21.572752403139138
Epoch 43000/100000, Loss: 21.34211337200876
Epoch 44000/100000, Loss: 21.0702495450661
Epoch 45000/100000, Loss: 20.837503486889897
Epoch 46000/100000, Loss: 20.681326474362805
Epoch 47000/100000, Loss: 20.503454394563672
Epoch 48000/100000, Loss: 20.389419746474474
Epoch 49000/100000, Loss: 20.074870271025098
Epoch 50000/100000, Loss: 19.98878160482701
Epoch 51000/100000, Loss: 19.762006774714624
Epoch 52000/100000, Loss: 19.73720805461732
Epoch 53000/100000, Loss: 19.840507926145058
Epoch 54000/100000, Loss: 19.586065516878563
Epoch 55000/100000, Loss: 19.26826647737148
Epoch 56000/100000, Loss: 19.186796811752668
Epoch 57000/100000, Loss: 19.128833329447612
Epoch 58000/100000, Loss: 18.86699431502371
Epoch 59000/100000, Loss: 18.991072309691766
Epoch 60000/100000, Loss: 19.037016453401602
Epoch 61000/100000, Loss: 18.865622588128197
Epoch 62000/100000, Loss: 18.872795070321768
Epoch 63000/100000, Loss: 18.872594451190064
Epoch 64000/100000, Loss: 18.854228191893057
Epoch 65000/100000, Loss: 18.67904692926805
Epoch 66000/100000, Loss: 18.768560510204782
Epoch 67000/100000, Loss: 18.7118185353233
Epoch 68000/100000, Loss: 18.55438967997513
Epoch 69000/100000, Loss: 18.621562397315216
Epoch 70000/100000, Loss: 18.405648834715997
Epoch 71000/100000, Loss: 18.189924349964524
Epoch 72000/100000, Loss: 18.353894145904075
Epoch 73000/100000, Loss: 18.45440674353988
Epoch 74000/100000, Loss: 18.39953074149147
Epoch 75000/100000, Loss: 18.364700160941528
Epoch 76000/100000, Loss: 18.186265195636466
Epoch 77000/100000, Loss: 18.302174526166176
Epoch 78000/100000, Loss: 18.205052422317795
Epoch 79000/100000, Loss: 18.037575818441386
Epoch 80000/100000, Loss: 18.01479027887508
Epoch 81000/100000, Loss: 17.96447524097066
Epoch 82000/100000, Loss: 17.895826329884876
Epoch 83000/100000, Loss: 17.7832487773441
Epoch 84000/100000, Loss: 17.86057435108409
Epoch 85000/100000, Loss: 17.703615956724253
Epoch 86000/100000, Loss: 17.68351796915479
Epoch 87000/100000, Loss: 17.633931736731242
Epoch 88000/100000, Loss: 17.612497052225557
Epoch 89000/100000, Loss: 17.647989798918914
Epoch 90000/100000, Loss: 17.710895613739616
Epoch 91000/100000, Loss: 17.598476799927635
Epoch 92000/100000, Loss: 17.56779767441564
Epoch 93000/100000, Loss: 17.668065621304482
Epoch 94000/100000, Loss: 17.48657393624495
Epoch 95000/100000, Loss: 17.609330714804045
Epoch 96000/100000, Loss: 17.576140983650948
Epoch 97000/100000, Loss: 17.568941202807263
Epoch 98000/100000, Loss: 17.52902584563828
Epoch 99000/100000, Loss: 17.383449295966283
Epoch 100000/100000, Loss: 17.320131803597924
 
----------------------------- Prediction ----------------------------- 
[[26.40028594]
 [35.95670906]
 [21.0375181 ]
 [26.81075528]
 [19.27303297]
 [19.24176243]
 [18.02909242]
 [18.33487919]
 [24.73263076]
 [18.90793689]
 [19.12267473]
 [17.93149187]
 [ 6.61505735]
 [20.76470599]
 [18.72246741]
 [30.04006402]
 [20.53259631]
 [10.52485402]
 [45.73780961]
 [18.29906554]
 [25.11074838]
 [26.06149324]
 [17.07979461]
 [22.89127798]
 [20.37305481]
 [15.75135761]
 [22.60178594]
 [18.58907094]
 [18.73504267]
 [18.63945006]
 [19.18184467]
 [24.63804329]
 [30.09810365]
 [28.96464891]
 [15.40000902]
 [19.41514728]
 [32.46295104]
 [22.51692248]
 [21.41680795]
 [26.37525141]
 [17.23718715]
 [34.40460321]
 [49.03923572]
 [20.31266774]
 [25.74679912]
 [18.24712181]
 [17.16189391]
 [27.57055882]
 [19.08726561]
 [31.30209539]
 [18.61876664]
 [33.61725349]
 [18.83749261]
 [28.45453076]
 [43.2806737 ]
 [28.16084359]
 [20.96559786]
 [36.19731044]
 [23.90688183]
 [17.84116438]
 [25.34401538]
 [32.92448779]
 [35.99460035]
 [21.36938789]
 [24.68693002]
 [16.16543793]
 [20.70512879]
 [25.19973729]
 [32.02685795]
 [16.72595575]
 [22.26460783]
 [34.84019666]
 [12.66375726]
 [23.07451255]
 [22.26649686]
 [ 8.78072356]
 [20.4205716 ]
 [46.24483168]
 [15.96989209]
 [15.28259261]
 [21.4773465 ]
 [13.02810024]
 [20.03181817]
 [11.16139533]
 [19.83595495]
 [29.22583834]
 [21.09276755]
 [26.42585934]
 [25.46828173]
 [20.37952764]
 [22.45176222]
 [ 9.03221341]
 [21.40233138]
 [19.99845823]
 [25.57073065]
 [22.63883292]
 [36.03449262]
 [ 9.66554266]
 [17.70571079]
 [16.65375084]
 [22.44931029]
 [23.52876957]]

  

 

posted @   映辉  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2023-05-06 Linux 系统用户登录时很慢怎么办
点击右上角即可分享
微信分享提示