# <center>21年美赛做题总结-编程的角度
## 1.lenet图像分类
1. 第一题:说明并讨论是否可以预测这种有害生物随时间的传播,以及精确程度如何
由于要预测,我们首先查看了数据集,发现positive的数量并不多并且大部分为不确定的或者是未被处理过的,
![输入图片说明](imgs/1.png)
于是我们看了第二题,‘仅使用提供的数据集文件和(可能)提供的图像文件来创建、分析和讨论预测错误分类可能性的模型‘,意思是要我们根据图像来对不确定的样本进行预测,于是就考虑先做第二题,先进行图像分类,因为要进行图像分类,所以就想到了要用神经网络,于是经过了...搜索,发现matlab有个可以进行**深度学习网络搭建的工具**可以使用下面的命令打开
```
deepNetworkDesigner
```
打开后就只需要把不同类别的图片放到不同的文件夹,使用类似于画流程图的方式搭建好网络就可以自动开始训练的,于是就考虑将不同类别的图片分到不同的文件夹下,要做到👈这点,首先需要通过GlobalID,将2021MCM_ProblemC_ Images_by_GlobalID文件中的FileName和2021MCMProblemC_DataSet.xlsx中的Lab Status放到一个表中,这块的编程如下:
% chubu1.m
```matlab
%用于将找到id和filename的对应关系,得到yongyutupianchuli.xlsx表格,表格备注在文件备注.xlsx中
%%
% 文件读取
[~,~,imgs]=xlsread('2021MCM_ProblemC_ Images_by_GlobalID.xlsx');
[~,~,details]=xlsread('2021MCMProblemC_DataSet.xlsx');
%%
usedforp{1,1}='GlobalID';
usedforp{1,2}='Lab Status';
usedforp{1,3}='FileName';
% 将图片表格里面id摘出来
imgsid=imgs(:,2);
imgname=imgs(:,1);
% 新表的索引
k=2;
unknow=[];
for i=2:4441
item=details{i,1};
index=find(strcmp(imgsid,item));
if length(index)==0
unknow=[unknow,i];
usedforp{k,1}=details{i,1};
usedforp{k,2}=details{i,4};
k=k+1;
continue;
end
indexl=length(index);
for j=1:indexl
usedforp{k,1}=imgsid{index(j),1};
usedforp{k,2}=details{i,4};
usedforp{k,3}=imgname{index(j),1};
k=k+1;
end
end
%%
% 存入表格
xlswrite('yongyutupianchuli.xlsx',usedforp,1);
```
**注:**
1. 非常重要!一个id可能对应多张图片,在搜索的时候一定要注意,最开始我没注意到,所以以为有些图片没有id,但实际是每张图片都有id,并且有的id没有图片,只有notes(关于这些怎么分类请看后文)
2. 那个看起来全是图片的文件夹里面有pdf和视频文件,这里我们是先根据文件名也就是使用上述程序先对不同文件分好类,然后在对应类的文件下把pdf中的图片取出,每个视频截三张图(这块取出和截图的时候要注意命名,因为还要通过文件名找到对应id
分好文件夹后(**分好的文件详见文件夹-'/处理后的data-classify2'**)就可以进行神经网络的搭建了,我最开始用一个叫sqeeze net,据说那个用来图像分类效果很好,但是我注意到它有68层,所以,,,后面它就把我的电脑跑崩了,于是我就换成了最基础的lenet-5来分类,下面是网络的流程图,对图片进行的增强(由于positive的样本实在太少,所以进行了增强)以及训练结果
![输入图片说明](imgs/lenet%E6%B5%81%E7%A8%8B%E5%9B%BE-2.png)
![输入图片说明](imgs/lenet%E5%A2%9E%E5%BC%BA.png)
![输入图片说明](imgs/lenet%E5%88%86%E7%B1%BB%E5%99%A8%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C.png)
训练后**使用分类器对图像分类得到的分类结果详见表classify.xlsx**
------
------
## 2. LSTM文本分类
上面说到由于有些id(指globalid,以下出现同义)没有图片、pdf和视频,就没办法使用以上方法进行分类,于是就考虑使用文本分析,就使用了lstm根据notes对没有label(指最初就没有label的)进行分类,lstm的代码如下:
% lstmfenlei.py
```python
% lstm文本分类
import pandas as pd
import re
import json
import numpy as np
import nltk
from sklearn.metrics import accuracy_score, classification_report
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from sklearn.model_selection import train_test_split
from tensorflow.keras.callbacks import EarlyStopping
import jieba as jb
# 读入数据
comment_data=pd.read_excel('havelabel.xlsx')
# print(comment_data.shape)
# print(comment_data.head())
# 数据预处理删除所有记录中包含的空值或空字符串
comment_data=comment_data.dropna()
guolv=comment_data['Notes']!=' '
comment_data=comment_data[guolv]
# print(comment_data.shape)
# 将label转换成id0,1,2这样
comment_data['label_id']=comment_data['Lab Status'].factorize()[0]
comment_id = comment_data[['Lab Status', 'label_id']].drop_duplicates().sort_values('label_id').reset_index(drop=True)
# 加载停用词
stopwords = nltk.corpus.stopwords.words("english")
# 分词并过滤停用词
comment_data['cNotes']=comment_data['Notes'].apply(lambda x: " ".join([w for w in list(jb.cut(x)) if w not in stopwords]))
# print(comment_data)
# LSTM建模
MAX_NB_WORDS = 50000
# 每条cut_review最大的长度
MAX_SEQUENCE_LENGTH = 250
# 设置Embeddingceng层的维度
EMBEDDING_DIM = 100
tokenizer = Tokenizer(num_words=MAX_NB_WORDS, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~', lower=True)
tokenizer.fit_on_texts(comment_data['cNotes'].values)
word_index = tokenizer.word_index
# print('共有 %s 个不相同的词语.' % len(word_index))
X = tokenizer.texts_to_sequences(comment_data['cNotes'].values)
# 填充X,让X的各个列的长度统一
X = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)
# 多类标签的onehot展开
Y = pd.get_dummies(comment_data['label_id']).values
# print(X.shape,Y.shape)
# print(X)
# print(Y)
# 拆分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.10, random_state=42)
print(X_train.shape, Y_train.shape)
print(X_test.shape, Y_test.shape)
# 定义模型
model = Sequential()
model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))
model.add(SpatialDropout1D(0.2))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# 模型训练
epochs = 5
batch_size = 64
history = model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, validation_split=0.1,
callbacks=[EarlyStopping(monitor='val_loss', patience=3, min_delta=0.0001)])
accr = model.evaluate(X_test, Y_test)
print('Test set\n Loss: {:0.3f}\n Accuracy: {:0.3f}'.format(accr[0], accr[1]))
# LSTM模型的评估
y_pred = model.predict(X_test)
y_pred = y_pred.argmax(axis=1)
Y_test = Y_test.argmax(axis=1)
print('accuracy %s' % accuracy_score(y_pred, Y_test))
print(classification_report(Y_test, y_pred, target_names=comment_id['Lab Status'].values))
def predict(text):
txt = text
txt = [" ".join([w for w in list(jb.cut(txt.lower())) if w not in stopwords])]
seq = tokenizer.texts_to_sequences(txt)
padded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)
pred = model.predict(padded)
cat_id = pred.argmax(axis=1)[0]
return comment_id[comment_id.label_id == cat_id]['Lab Status'].values[0]
# 分类
unpro=pd.read_excel('unpro.xlsx')
# print(unpro['Notes'][len(unpro)-1])
# print()
unpro['nlplabel'] = unpro['Lab Status']
for i in range(len(unpro)):
unpro['nlplabel'][i]=predict(unpro['Notes'][i])
unpro.to_excel('unprolabelnlp.xlsx')
```
**使用lstm分类的结果见表unprolabelnlp.xlsx**
------
------
## 3.lstm预测
先将两种分类结果合并
% fenleilast.m
```matla
美赛做题总结-编程的角度
165 浏览量
2024-01-05
19:42:08
上传
评论
收藏 3.72MB ZIP 举报
十小大
- 粉丝: 9989
- 资源: 2555