用iris.csv数据构建神经网络预测花的种类:将所有数据 随机分为训练集和测试集,分别计算测试集上总的准确率和不同类的准确率。
时间: 2023-12-06 22:44:41 浏览: 68
好的,让我们来实现这个任务。
首先,我们需要导入必要的库和加载数据。我们可以使用`pandas`库中的`read_csv()`函数来加载`iris.csv`文件。然后,我们可以将数据随机分为训练集和测试集,这里我们使用`train_test_split()`函数来完成。
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# 加载数据
iris_data = pd.read_csv('iris.csv')
# 随机分为训练集和测试集
train_data, test_data, train_labels, test_labels = train_test_split(iris_data.iloc[:, :-1], iris_data.iloc[:, -1],
test_size=0.2, random_state=42)
```
接下来,我们需要对数据进行预处理。在这里,我们将使用`LabelEncoder`来将类别标签编码为数字。然后,我们使用`StandardScaler`来对特征进行标准化,这可以提高模型的性能。
```python
from sklearn.preprocessing import LabelEncoder, StandardScaler
# 将类别标签编码为数字
encoder = LabelEncoder()
train_labels = encoder.fit_transform(train_labels)
test_labels = encoder.transform(test_labels)
# 对特征进行标准化
scaler = StandardScaler()
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data)
```
现在,我们可以构建神经网络模型。在这里,我们选择使用`Keras`库来构建模型。我们使用`Sequential`模型来构建一个具有两个隐藏层的多层感知器(MLP)模型,并使用`softmax`激活函数作为输出层的激活函数。我们还将使用`categorical_crossentropy`损失函数和`adam`优化器。
```python
from keras.models import Sequential
from keras.layers import Dense
# 构建神经网络模型
model = Sequential()
model.add(Dense(64, input_dim=4, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(3, activation='softmax'))
# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
```
在模型构建和编译之后,我们可以训练模型。在这里,我们将使用`fit()`函数来训练模型,并使用测试集来评估模型的性能。我们还将使用`predict()`函数来预测测试集上的类别标签。
```python
from keras.utils import to_categorical
# 将类别标签转换为独热编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 训练模型
model.fit(train_data, train_labels, epochs=50, batch_size=10, verbose=0)
# 在测试集上评估模型
loss, accuracy = model.evaluate(test_data, test_labels, verbose=0)
print('总的准确率:', accuracy)
# 计算不同类的准确率
predictions = model.predict(test_data)
for i, label in enumerate(encoder.classes_):
class_accuracy = np.mean(predictions[test_labels[:, i] == 1] == i)
print('类别 {} 的准确率:{}'.format(label, class_accuracy))
```
这样,我们就完成了使用神经网络预测鸢尾花种类的任务。完整的代码如下:
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
# 加载数据
iris_data = pd.read_csv('iris.csv')
# 随机分为训练集和测试集
train_data, test_data, train_labels, test_labels = train_test_split(iris_data.iloc[:, :-1], iris_data.iloc[:, -1],
test_size=0.2, random_state=42)
# 将类别标签编码为数字
encoder = LabelEncoder()
train_labels = encoder.fit_transform(train_labels)
test_labels = encoder.transform(test_labels)
# 对特征进行标准化
scaler = StandardScaler()
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data)
# 将类别标签转换为独热编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 构建神经网络模型
model = Sequential()
model.add(Dense(64, input_dim=4, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(3, activation='softmax'))
# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(train_data, train_labels, epochs=50, batch_size=10, verbose=0)
# 在测试集上评估模型
loss, accuracy = model.evaluate(test_data, test_labels, verbose=0)
print('总的准确率:', accuracy)
# 计算不同类的准确率
predictions = model.predict(test_data)
for i, label in enumerate(encoder.classes_):
class_accuracy = np.mean(predictions[test_labels[:, i] == 1] == i)
print('类别 {} 的准确率:{}'.format(label, class_accuracy))
```
阅读全文