这篇文章是在前篇文章的基础上进行的更改的,补充了简单的数据处理部分
1. 完成缺失值处理
2. 完成数据编码与标准化
3. 完成数据集的划分(可尝试多种划分方法)
4. 完成建立鸢尾花分类模型(可尝试使用 K 近邻、决策树、SVM 等不同算法)
5. 对建立的模型进行评估
6. 可视化展⽰训练过程(选做)
提示:
数据的处理我使用的是pandas库
data=pd.read_csv("D:\pythonProject\iris.csv")
#print(data.info())这里可以看出有多少缺失值
#这里使用的均值补充的缺失值
data["Sepal.Length"].fillna(data["Sepal.Length"].mean(skipna=True), inplace=True)
data["Sepal.Width"].fillna(data["Sepal.Width"].mean(skipna=True), inplace=True)
data["Petal.Length"].fillna(data["Petal.Length"].mean(skipna=True), inplace=True)
data["Petal.Width"].fillna(data["Petal.Width"].mean(skipna=True), inplace=True)
#进行将标签转化为数值
data['Species'].replace(('setosa','versicolor','virginica'),(0,1,2),inplace=True)
#这里进行数据的标准化
data["Sepal.Length"]=(data["Sepal.Length"]-data["Sepal.Length"].mean())/data["Sepal.Length"].std()
data["Sepal.Width"]=(data["Sepal.Width"]-data["Sepal.Width"].mean())/data["Sepal.Width"].std()
data["Petal.Length"]=(data["Petal.Length"]-data["Petal.Length"].mean())/data["Petal.Length"].std()
data["Petal.Width"]=(data["Petal.Width"]-data["Petal.Width"].mean())/data["Petal.Width"].std()
X = data.drop('Species',1)
Y = data.Species
X=pd.get_dummies(X)
X=np.array(X)#改成了Numpy数组,这样后面的reshape就没有问题了
Y=np.array(Y)
X,Y = shuffle(X,Y, random_state=20)
train,test,train_label,test_label=train_test_split(X, Y,
test_size=0.3,
random_state=1)
train_label=train_label.reshape(-1,1)
test_lable=test_label.reshape(-1,1)
代码如下(示例):
class mynet(torch.nn.Module):
def __init__(self):
super(mynet,self).__init__()
self.features=nn.Sequential(
torch.nn.Linear(4, 18),
nn.ReLU(inplace=True),
torch.nn.Linear(18, 3)
)
def forward(self,x):
y=self.features(x)
return y
代码如下(示例):
batch=15
module=mynet()#输入特征为4,输出标签为3
train_dataset = Data.TensorDataset(torch.from_numpy(train).float(),torch.from_numpy(train_label).long())
train_loader = Data.DataLoader(dataset=train_dataset,batch_size=batch,shuffle=True)
acc=[]
loss_all=[]
train_acc=[]
loss_fun = nn.CrossEntropyLoss() # 设置交叉熵损失函数
optimizer = torch.optim.SGD(params=module.parameters(), lr=0.01) # 设置随机梯度下降,步长为0.01
for epoch in range (1000):
step = 0
loss_one = 0
for step, (x, y) in enumerate(train_loader):
y = torch.reshape(y, [batch])
out=module.forward(x)
loss = loss_fun(out, y)
loss_one+=loss.item()/batch
optimizer.zero_grad() # 梯度清零
loss.backward() # 计算梯度
optimizer.step() # 更新参数
if epoch % 20 == 0:
print('Epoch: ', epoch, '| Step: ', step, '| batch y: ', y.numpy())
loss_all.append(loss_one/(step+1))
output = module.forward(torch.from_numpy(test).float())
prediction = torch.max(output, 1)[1]
pred_y = prediction.data.numpy()
test_y = test_label.reshape(1, -1)
target_y = torch.from_numpy(test_y).long().data.numpy()
acc.append(float((pred_y == target_y).astype(int).sum()) / float(target_y.size))
output_train = module.forward(torch.from_numpy(train).float())
prediction_y = torch.max(output_train, 1)[1]
pred_train = prediction_y.data.numpy()
train_y = train_label.reshape(1, -1)
target_train = torch.from_numpy(train_y).long().data.numpy()
train_acc.append(float((pred_train == target_train).astype(int).sum()) / float(target_train.size))
#roc
fpr,tpr,thersholds=roc_curve(test_lable,pred_y,pos_label=2)
for i, value in enumerate(thersholds):
print("%f %f %f" % (fpr[i], tpr[i], value))
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr,color='darkorange', label='ROC (area = {0:.2f})'.format(roc_auc), lw=2)
plt.xlim([-0.05, 1.05]) # 设置x、y轴的上下限,以免和边缘重合,更好的观察图像的整体
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') # 可以使用中文,但需要导入一些库即字体
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.show()
#accuracy
x=np.linspace(1,100,1000)
plt.xlabel("Iterations")
plt.ylabel("accuracy")
l1=plt.plot(x,acc,label='test',color="r")
l2=plt.plot(x,train_acc,label='train',color="b")
plt.legend(loc='lower right')
plt.show()
#loss
x=np.linspace(1,1000,1000)
plt.xlabel("Iterations")
plt.ylabel("loss")
plt.plot(x,loss_all,color="r")
plt.show()
print("鸢尾花预测准确率", acc[-1])
本次博客只是对上一篇博客补充,代码本身也有瑕疵,欢迎大家指出。