幸运地的我碰到你@_@!点击下方↑↑↑ “OpenCV绘图演算法”!
现阶段应用程序不全力支持播映音乐创作或音频,请在QQ或其它应用程序中播映 我没错 音乐创作: 王力宏 – The Era 2010 超黄金时代音乐会1. 两栖作战Kaggle赛事:楼价预估
做为广度自学此基础诗篇的归纳,上面,亲自动手两栖作战两个Kaggle赛事:楼价预估。范例将提供更多需经Listary的统计数据的后处置、数学模型的结构设计和超模块的优先选择。这儿须要在官方网站上他们注册登记Kaggle帐号。楼价预估赛事的页面门牌号是 https://www.kaggle.com/c/house-prices-advanced-regression-techniques 。
比赛统计数据分成体能训练统计数据集和测试统计数据集。三个统计数据集都主要包括三幢新房子的特点,如市中区类别、修建年数、屋顶类别、地窖情况等特点向量。那些特点向量有已连续的位数、对数的条码即使是缺位值“na”。多于体能训练统计数据集主要包括了三幢房子的产品价格,也是条码。能出访赛事页面,点选“Data”条码,并浏览那些统计数据集。浏览后的统计数据坐落于我放到工程项目产品目录与 .py 文档同价位产品目录下,采用pandas加载这三个文档。透过pandas库初始化并处置数据。须要保证已加装pandas库。
# 假如没加装pandas,则反注解上面带队# !pip install pandasimporttorch
import torch.nn asnn
importnumpyasnp
import pandas aspd
importtorch.utils.data
import utils asd2l
print(torch.__version__)
torch.set_default_tensor_type(torch.FloatTensor)
train_data = pd.read_csv(train.csv)
test_data = pd.read_csv(test.csv)
print(train_data.shape)
print(test_data.shape)
#查看前4个样本的前4个特点、后2个特点和条码(SalePrice)print(train_data.iloc[0:4,[0,1,2,3,-3,-2,-1]])
输出结果:
(1460, 81)
(1459, 80)
能看到体能训练统计数据集主要包括1460个样本、80个特点和1个条码;测试统计数据集主要包括1459个样本和80个特点。我们须要将测试统计数据集中每个样本的条码预估出来。查看前4个样本的前4个特点、后2个特点和条码(SalePrice),能看到第两个特点是Id,它能帮助数学模型记住每个体能训练样本,但难以推广到测试样本,所以不采用它来体能训练。将所有的体能训练统计数据和测试统计数据的79个特点按样本连结。
all_features = pd.concat((train_data.iloc[:,1:-1],test_data.iloc[:,1]))
1.2 后处置统计数据
对已连续数值的特点做标准化(standardization):设该特点在整个统计数据集上的均值为,标准差为。那么,能将该特点的每个值先减去 再除以 得到标准化后的每个特点向量。对于缺位的特点向量,我们将其替换成该特点的均值。
numeric_features = all_features.dtypes[all_features.dtypes !=object].index
all_features[numeric_features] = all_features[numeric_features].apply(
lambdax: (x – x.mean()) / (x.std()))
# 标准化后,每个数值特点的均值变为0,所以能直接用0来替换缺位值all_features[numeric_features] = all_features[numeric_features].fillna(0)
接下来将对数数值转成指示特点。举个范例,假设特点MSZoning里面有三个不同的对数值RL和RM,那么这一步转换将去掉MSZoning特点,并新加三个特点MSZoning_RL和MSZoning_RM,其值为0或1。假如两个样本原来在MSZoning里的值为RL,那么有MSZoning_RL=1且MSZoning_RM=0。# dummy_na=True将缺位值也当作合法的特点向量并为其创建指示特点all_features = pd.get_dummies(all_features,dummy_na=True)
print(all_features.shape) #(2919, 331)能看到这一步转换将特点数从79增加到了331。最后,透过values属性得到NumPy格式的统计数据,并转成NDArray方便后面的体能训练。n_train = train_data.shape[0]
train_features = torch.tensor(all_features[:n_train].values,dtype=torch.float)
test_features = torch.tensor(all_features[n_train:].values,dtype=torch.float)
train_labels = torch.tensor(train_data.SalePrice.values,dtype=torch.float).view(-1,1)
1.3 体能训练数学模型
我们采用两个基本的线性回归数学模型和平方损失函数来体能训练数学模型。loss = torch.nn.MSELoss()
def get_net(feature_num): net = nn.Linear(feature_num,1)
for param innet.parameters():
nn.init.normal_(param,mean=0,std=0.01)
returnnet
上面定义赛事用来评价数学模型的对数均方根误差。给定预估值 和对应的真实条码 ,它的定义为对数均方根误差的实现如下。def log_rmse(net,features,labels): withtorch.no_grad():
# 将小于1的值设成1,使得取对数时数值更稳定clipped_preds = torch.max(net(features),torch.tensor(1.0))
rmse = torch.sqrt(2* loss(clipped_preds.log(),labels.log()).mean())
returnrmse.item()
上面的体能训练函数跟前几节的不同在于采用了Adam优化演算法。相对之前采用的小批量随机梯度下降,它对自学率相对不那么敏感。def train(net,train_features,train_labels,test_features,test_labels,
num_epochs,learning_rate,weight_decay,batch_size) :train_ls,test_ls = [],[]
dataset = torch.utils.data.TensorDataset(train_features,train_labels)
train_iter = torch.utils.data.DataLoader(dataset,batch_size,shuffle=True)
optimizer = torch.optim.Adam(params=net.parameters(),lr=learning_rate,weight_decay=weight_decay)
net = net.float()
for epoch inrange(num_epochs):
for X,y intrain_iter:
l = loss(net(X.float()),y.float())
optimizer.zero_grad()
l.backward()
optimizer.step()
train_ls.append(log_rmse(net,train_features,train_labels))
if test_labels is not None:
test_ls.append(log_rmse(net,test_features,test_labels))
returntrain_ls,test_ls
1.4 k 折交叉验证
在数学模型优先选择、欠拟合和过拟合中介绍了折交叉验证。它将被用来优先选择数学模型结构设计并调节超模块。上面实现了两个函数,它返回第i折交叉验证时所须要的体能训练和验证统计数据。def get_k_flod_data(k,i,X,y): # 返回第i折交叉验证时所须要的体能训练和验证统计数据 assert k >1fold_size = X.shape[0] // k
X_train,y_train = None,None for j inrange(k):
idx = slice( j * fold_size,(j +1) * fold_size)
X_part,y_part = X[idx,:],y[idx]
ifj == i:
X_valid,y_valid = X_part,y_part
elif X_train is None:
X_train,y_train = X_part,y_part
else:
X_train = torch.cat((X_train,X_part),dim=0)
y_train = torch.cat((y_train,y_part),dim=0)
returnX_train,y_train,X_valid,y_valid
在折交叉验证中我们体能训练次并返回体能训练和验证的平均误差。def k_fold(k,X_train,y_train,num_epochs,
learning_rate,weight_decay,batch_size) : train_l_sum,valid_l_sum = 0,0 for i inrange(k):
data = get_k_flod_data(k,i,X_train,y_train)
net = get_net(X_train.shape[1])
train_ls,valid_ls = train(net,*data,num_epochs,learning_rate,
weight_decay,batch_size)
train_l_sum += train_ls[-1]
valid_l_sum += valid_ls[-1]
if i == 0:
d2l.semilogy(range(1,num_epochs + 1),train_ls,epochs,rmse,
range(1,num_epochs + 1),valid_ls,[train,valid])
print(fold %d, train rmse %f,valid rmse %f %(i,train_ls[-1],valid_ls[-1]))
returntrain_l_sum / k ,valid_l_sum /k
1.5 数学模型优先选择
采用一组需经Listary的超模块并计算交叉验证误差。能改动那些超模块来尽可能减小平均测试误差。k,num_epochs,lr,weight_decay,batch_size =5,100,5,0,64train_l,valid_l = k_fold(k,train_features,train_labels,num_epochs,lr,weight_decay,batch_size)
print(%d-fold validation: avg train rmse %f, avg valid rmse %f% (k, train_l, valid_l))
plt.show()
输出结果:fold 0, train rmse 0.240393,valid rmse 0.222026fold 1, train rmse 0.229521,valid rmse0.267963fold 2, train rmse 0.231740,valid rmse 0.238130fold 3, train rmse 0.237747,valid rmse 0.218573fold4, train rmse 0.231194,valid rmse 0.2589795-fold validation: avg train rmse 0.234119, avg valid rmse0.241134效果图有时候你会发现一组模块的体能训练误差能达到很低,但是在 折交叉验证上的误差可能反而较高。这种现象很可能是由过拟合造成的。因此,当体能训练误差降低时,要观察 折交叉验证上的误差是否也相应降低。1.6 预估并在Kaggle提交结果
上面定义预估函数。在预估之前,我们会采用完整的体能训练统计数据集来重新体能训练数学模型,并将预估结果存成提交所须要的格式。def train_and_pred(train_features,test_features,train_labels,test_data,
num_epochs,lr,weight_decay,batch_size) :net = get_net(train_features.shape[1])
train_ls,_ = train(net,train_features,train_labels,None,None,
num_epochs,lr,weight_decay,batch_size)
d2l.semilogy(range(1,num_epochs + 1),train_ls,epochs,rmse)
print(train rmse %f% train_ls[-1])
preds = net(test_features).detach().numpy()
test_data[SalePrice] = pd.Series(preds.reshape(1,-1)[0])
submission = pd.concat([test_data[Id],test_data[SalePrice]],axis=1)
submission.to_csv(./sunmission.csv,index=False)
结构设计好数学模型并调好超模块之后,下一步是对测试统计数据集上的房屋样本做产品价格预估。假如得到与交叉验证时差不多的体能训练误差,那么这个结果很可能是理想的,能在Kaggle上提交结果。train_and_pred(train_features,test_features,train_labels,test_data,num_epochs,lr,weight_decay, batch_size)
plt.show()
效果图
上述代码执行完之后会生成两个submission.csv文档。这个文档是符合Kaggle赛事要求的提交格式的。这时,能在Kaggle上提交我们预估得出的结果,并且查看与测试统计数据集上真实楼价(条码)的误差。具体来说有以下几个步骤:登录Kaggle网站,出访楼价预估赛事页面,并点选右侧Submit Predictions 或 Late Submission 按钮;然后,点选页面下方 Upload File 图标所在的虚线框优先选择须要提交的预估结果文档;最后,点选页面最下方的 Make Submission 按钮就能查看结果了,如下图所示。1.7 归纳
通常须要对真实统计数据做后处置。
能采用 折交叉验证来优先选择数学模型并调节超模块。
● 数值稳定性和数学模型初始化● 正向传播、反向传播和计算图● 广度自学此基础-丢弃法—END—QQ:1241716616
邮箱:1241716616@qq.com