鸢尾花分类——后续(读取csv文件,并对数据进行处理数据)

这篇文章是在前篇文章的基础上进行的更改的,补充了简单的数据处理部分

文章目录

  • 题目要求
  • 一、数据读入和处理部分
  • 二、搭建网络和训练
    • 1.网络代码
    • 2.训练部分
  • 三、画出roc、loss、accuracy曲线
  • 总结


题目要求

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)

二、搭建网络和训练

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

2.训练部分

代码如下(示例):

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、loss、accuracy曲线

#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])

总结

本次博客只是对上一篇博客补充,代码本身也有瑕疵,欢迎大家指出。

你可能感兴趣的:(分类,机器学习,python)