2022 国赛 C 题 | Jim Zhang's blog
2022 国赛 C 题2022-09-15

我麻了!C 题怎么还是这么中规中矩。。打开附件的 sheet 1,这不是鸢尾花数据集吗?(倒是多了几个 missing 的数据)

Question 1

第一问我真是不想说了,决策树都能到 0.9 分以上。我们还是用老朋友 scikit-learn 吧。

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier
import pandas as pd

请确保你的 sheet 1 保存成了 .csv 文件,因为 pandas 读取 excel 文件实在是太慢了。这里我把它保存成了 ./sheet-1.csv,前几行大约是这样:

文物编号,纹饰,类型,颜色,表面风化
01,C,高钾,蓝绿,无风化
02,A,铅钡,浅蓝,风化
03,A,高钾,蓝绿,无风化
04,A,高钾,蓝绿,无风化

接下来,我们就进行非常容易的标注、分类训练、评分:

df = pd.read_csv('sheet-1.csv').drop('文物编号', axis=1)

#%% 标注
df = df.dropna() #! drop nan!!!!
le_texture, le_class, le_color, le_surface = LabelEncoder(), LabelEncoder(), LabelEncoder(), LabelEncoder() # 这里的目的是让 LabelEncoder() 还能转换回去,当然你不想让他转换也可以。
df['纹饰'] = le_texture.fit_transform(df['纹饰'])
df['类型'] = le_class.fit_transform(df['类型'])
df['颜色'] = le_color.fit_transform(df['颜色'])
df['表面风化'] = le_surface.fit_transform(df['表面风化'])
df.tail()

#%% 分类,选一些做测试集
clf = DecisionTreeClassifier()
X = df[['纹饰', '类型', '颜色']].values; y = df['表面风化'].values
# train test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf.fit(X_train, y_train)

#%% 评分
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

报告如下:

              precision    recall  f1-score   support

           0       1.00      0.86      0.92         7
           1       0.80      1.00      0.89         4

    accuracy                           0.91        11
   macro avg       0.90      0.93      0.91        11
weighted avg       0.93      0.91      0.91        11

偶也,random_state=42 名不虚传,得分上 0.9 了!

Question 2