96SEO 2026-02-23 12:50 21
人工智能(Pytorch)赛道https://bbs.csdn.net/topics/613989052

在此项目中目的是预测爱荷华州Ames的房价给定81个特征描述了房子、面积、土地、基础设施、公共设施等。
埃姆斯数据集具有分类和连续特征的良好组合大小适中也许最重要的是它不像其他类似的数据集如波士顿住房那样存在潜在的红线或数据输入问题。
在这里我将主要讨论PyTorch建模的相关方面作为一点额外的内容我还将演示PyTorch中开发的模型的神经元重要性。
你可以在PyTorch中尝试不同的网络架构或模型类型。
本项目中的重点是方法论而不是详尽地寻找最佳解决方案。
为了准备这个项目我们首先需要下载数据并通过以下步骤进行一些预处理。
关于该数据集的完整描述你可以去该网址查看https://www.openml.org/d/42165。
在这里首先要进行数据缩放处理因为所有的变量都有不同的尺度。
分类变量需要转换为数值类型以便将它们输入到我们的模型中。
我们可以选择一热编码即我们为每个分类因子创建哑变量或者是序数编码即我们对所有因子进行编号并用这些数字替换字符串。
我们可以像其他浮动变量一样将虚拟变量送入而序数编码则需要使用嵌入即线性神经网络投影在多维空间中对类别进行重新排序。
我们在这里采取嵌入的方式。
list(data_ames.select_dtypes(includefloat))
list(data_ames.select_dtypes(includeobject))ordinal_encoder
OrdinalEncoder().fit(data_ames[cat_cols]
StandardScaler().fit(data_ames[num_cols]
pd.DataFrame(datanp.column_stack([ordinal_encoder.transform(data_ames[cat_cols]),standard_scaler.transform(data_ames[num_cols])]),columnscat_cols
在构建模型之前我们需要将数据拆分为训练集和测试集。
在这里我们添加了一个数值变量的分层。
这可以确保不同的部分其中五个在训练集和测试集中都以同等的数量包含。
train_test_split(X.drop(columnsSalePrice),X[SalePrice],random_state12,stratifysale_price_bins
接下来开始建立我们的PyTorch模型。
我们将使用PyTorch实现一个具有批量输入的神经网络回归具体将涉及以下步骤。
Variable(torch.cuda.FloatTensor(X_train[num_features].values)
Variable(torch.cuda.LongTensor(X_train[cat_cols].values)
Variable(torch.cuda.FloatTensor(y_train.values)
Variable(torch.cuda.FloatTensor(X_test[num_features].values)
Variable(torch.cuda.LongTensor(X_test[cat_cols].values).long()
Variable(torch.cuda.FloatTensor(y_test.values)
这可以确保我们将数字和分类数据加载到单独的变量中类似于NumPy。
如果你把数据类型混合在一个变量数组/矩阵中它们就会变成对象。
我们希望把数值变量弄成浮点数把分类变量弄成长或int索引我们的类别。
我们还将训练集和测试集分开。
显然一个ID变量在模型中不应该是重要的。
在最坏的情况下如果ID与目标有任何相关性它可能会引入目标泄漏。
我们已经把它从这一步的处理中删除了。
RegressionModel(torch.nn.Module):
hidden_layer_dimself.embeddings
[torch.nn.Embedding(num_embeddingslen(X[col].unique()),embedding_dimembed_dim).to(device)for
torch.nn.Linear(torch.IntTensor(hidden_dim),
hidden_layer_dim).to(device)self.dropout_layer
torch.nn.Dropout(pp).to(device)self.hidden_act
torch.nn.Linear(hidden_layer_dim,
[torch.squeeze(embed(cat_inputs[:,
我们在两个线性层上的激活函数是整流线性单元激活ReLU函数。
这里需要注意的是我们不可能将相同的架构很容易封装成一个顺序模型因为分类和数值类型上发生的操作不同。
接下来定义损失准则和优化器。
我们将均方误差MSE作为损失随机梯度下降作为我们的优化算法。
torch.optim.SGD(house_model.parameters(),
torch.utils.data.TensorDataset(X_train_num_pt,
torch.utils.data.DataLoader(data_batch,
基本上我们要在epoch上循环在每个epoch内推理出性能计算出误差优化器根据误差进行调整。
这是在没有训练的内循环的情况下在epochs上的循环。
(x_train_num_batch,x_train_cat_batch,y_train_batch)
dataloader:(x_train_num_batch,x_train_cat_batch,
(x_train_num_batch.to(device),x_train_cat_batch.to(device),y_train_batch.to(device))pred_ytrain
house_model.forward(x_train_num_batch,
torch.sqrt(criterion(pred_ytrain,
torch.no_grad():house_model.eval()pred_ytest
house_model.forward(X_test_num_pt,
torch.sqrt(criterion(pred_ytest,
y_test_pt))train_losses.append(train_loss
len(dataloader))test_losses.append(test_loss
plt.plot(np.array(train_losses).reshape((n_epochs,
plt.plot(np.array(test_losses).reshape((n_epochs,
-1)).mean(axis1),labelValidation
在我们的验证损失停止下降之前我们及时停止了训练。
我们还可以对目标变量进行排序和bin并将预测结果与之对比绘制以便了解模型在整个房价范围内的表现。
这是为了避免回归中的情况尤其是用MSE作为损失即你只对一个中值范围的预测很好接近平均值但对其他任何东西都做得不好。
我们可以看到事实上这个模型在整个房价范围内的预测非常接近。
事实上我们得到的Spearman秩相关度约为93%具有非常高的显著性这证实了这个模型的表现具有很高的准确性。
深度学习神经网络框架使用不同的优化算法。
其中流行的有随机梯度下降SGD、均方根推进RMSProp和自适应矩估计ADAM。
我们定义了随机梯度下降作为我们的优化算法。
另外我们还可以定义其他优化器。
torch.optim.SGD(net_SGD.parameters(),
torch.optim.SGD(net_Momentum.parameters(),
torch.optim.RMSprop(net_RMSprop.parameters(),
torch.optim.Adam(net_Adam.parameters(),
SGD的工作原理与梯度下降相同只是它每次只在一个例子上工作。
有趣的是收敛性与梯度下降相似并且更容易占用计算机内存。
RMSProp的工作原理是根据梯度符号来调整算法的学习率。
最简单的变体是检查最后两个梯度符号然后调整学习率如果它们相同则增加一个分数如果它们不同则减少一个分数。
ADAM是最流行的优化器之一。
它是一种自适应学习算法根据梯度的第一和第二时刻改变学习率。
Captum是一个工具可以帮助我们了解在数据集上学习的神经网络模型的来龙去脉。
它可以帮助我们学习以下内容。
这在学习可解释的神经网络中是非常重要的。
在这里综合梯度已经被应用于理解特征重要性。
之后还用层传导法来证明神经元的重要性。
(IntegratedGradients,LayerConductance,NeuronConductance
house_model.embeddings:embedding.cpu()house_model.cpu()
IntegratedGradients(forward_funchouse_model.forward,
#X_test_cat_pt.requires_grad_()
ing_house.attribute(X_test_num_pt.cpu(),targetNone,return_convergence_deltaTrue,additional_forward_argsX_test_cat_pt.cpu()
现在我们有了一个NumPy的特征重要性数组。
层和神经元的重要性也可以用这个工具获得。
让我们来看看我们第一层的神经元importances。
我们可以传递house_model.act1这是第一层线性层上面的ReLU激活函数。
这张图显示了神经元的重要性。
显然一个神经元就是不重要的。
我们还可以通过对之前得到的NumPy数组进行排序看到最重要的变量。
通常情况下特征导入可以帮助我们既理解模型又修剪我们的模型使其变得不那么复杂希望减少过度拟合。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback