NCU-机器学习-作业1:基于KNN的IRIS分类

任务描述:

请设计一个分类器,根据花朵的萼片长度(sepal length)、萼片宽度sepalwidth)、花瓣长度(petal length)和花瓣宽度(petal width)来预测它属于三种不同的鸢尾属植物setosa、versicolor和virginica中的哪一种。

输入数据:

在train/目录下包含一个train.csv文件,其中每行代表一个已知样例。文件中每行共有6列,第一列为id,2-5列为四个属性值,最后一列表示该花朵属于哪种植物,分别用0,1,2来表示setosa、versicolor和virginica。

在test/目录下包含一个test.csv文件,与train.csv类似,每一行表示一朵花瓣的四个属性参数和ID,不过不包含它的分类值,您需要根据参数给出预测。

输出数据:

你的程序需要生成一个result.csv文件,用于保存你程序对花朵情况的预测结果。输出csv文件格式见下方

输入样例:

Id,Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species
1,5.1,3.5,1.4,0.2,0
2,4.9,3.0,1.4,0.2,0
3,4.7,3.2,1.3,0.2,0
4,4.6,3.1,1.5,0.2,0

输出样例:

Id,Species
1,1
2,0
3,2
4,2
5,2
6,2

思路代码:

# 导入所需的库
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 加载训练数据
data = pd.read_csv('train/train.csv')

# 分割特征和目标变量
X = data.iloc[:, 1:-1]  # 特征,0列为ID,所以从1列开始
y = data.iloc[:, -1]  # 目标值 (labels)

# 数据预处理(暂时只做标准化,也可以不做)
scaler = StandardScaler()
X_train = scaler.fit_transform(X)
y_train = list(y)

# 初始化并训练KNN分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 加载测试数据
test_data = pd.read_csv('test/test.csv')

# 分割特征和目标变量
X = test_data.iloc[:, 1:-1]  # 特征
y = test_data.iloc[:, -1]   # 目标值

# 数据预处理
scaler = StandardScaler()
X_test = scaler.fit_transform(X)
y_test = list(y)

# 预测
y_pred = knn.predict(X_test)

# print(knn.score(X_test, y_test))

df = pd.DataFrame(data=test_data['Id'], columns=['Id'])
df['Species'] = y_pred
df.to_csv('result.csv', index=False)

数据代码:

如果无数据测试,可以从内置数据集中生成,代码如下。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd

# 加载鸢尾花数据集
iris_dataset = load_iris()
# 划分训练集和测试集,一共150份数据,按9:1划分数据集
X_train, X_test, y_train, y_test = train_test_split(iris_dataset.data, iris_dataset.target, test_size=0.1)

df1 = pd.DataFrame(data=X_train,
                   columns=['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width'])
df1['Species'] = y_train

df2 = pd.DataFrame(data=X_test,
                   columns=['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width'])
df2['Species'] = y_test

df1.to_csv('train/train.csv', index_label='Id')  # 训练集
df2.to_csv('test/test.csv', index_label='Id')  # 测试集

答案提交:

提交result.csv压缩成的压缩包即可,无需提交py文件,result.csv中记录要求15条。为了安心,也可以在压缩包中加入py文件,单纯提交py文件无法通过(泪的教训)。

好的,让我来回答你的问题。 首先,感知器算法是一种二元分类算法,它可以通过输入样本的特征值,对样本进行分类。对于iris数据集,我们可以选择其中的两个特征:萼片长度和花瓣长度,来进行分类。 以下是实现步骤: 1. 首先,我们需要使用pandas库读入iris数据集,并取出前100组数据。 ```python import pandas as pd url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data' iris = pd.read_csv(url, header=None) iris = iris.iloc[:100,:] ``` 2. 接着,我们需要将数据集中的类别标签进行编码。将Iris-setosa编码为-1,将Iris-versicolor编码为+1。 ```python import numpy as np y = np.where(iris.iloc[:, -1]=='Iris-setosa', -1, 1) ``` 3. 接下来,我们需要提取数据集中的两个特征列:萼片长度和花瓣长度,并将它们组合成一个特征矩阵。 ```python X = iris.iloc[:, [0, 2]].values ``` 4. 然后,我们需要将数据集中的样本进行可视化,以便观察是否存在线性分界面。 ```python import matplotlib.pyplot as plt plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa') plt.scatter(X[50:, 0], X[50:, 1], color='blue', marker='x', label='versicolor') plt.xlabel('sepal length') plt.ylabel('petal length') plt.legend(loc='upper left') plt.show() ``` 5. 我们可以看到,通过萼片长度和花瓣长度这两个特征,可以很好地将setosa和versicolor两种花分开。接下来,我们可以使用感知器算法对这些样本进行分类,并记录迭代次数与错误分类样本数的关系。 ```python from perceptron import Perceptron ppn = Perceptron(eta=0.1, n_iter=10) ppn.fit(X, y) plt.plot(range(1, len(ppn.errors_)+1), ppn.errors_, marker='o') plt.xlabel('Epochs') plt.ylabel('Number of errors') plt.show() ``` 其中,Perceptron类是我们自己实现的感知器算法。eta表示学习率,n_iter表示迭代次数。在训练过程中,我们记录了每次迭代的错误分类样本数,并将它们绘制成图表。 以上就是利用iris数据集对感知器算法进行训练的过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值