任务描述:
请设计一个分类器,根据花朵的萼片长度(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
思路代码:
python
# 导入所需的库
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)
数据代码:
如果无数据测试,可以从内置数据集中生成,代码如下。
python
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文件无法通过(泪的教训)。