第一部分:人工智能基礎環境搭建部署(15分)
注:任務1與任務2任選一題完成即可,
o 任務1:Anaconda 3、scikit-learn、OpenCV 3.X、PyTorch 1.8.X、torchvision 0.9.X庫的安裝與配置,
要求(1)需使用比賽平臺提供的上述各軟體安裝包進行安裝與配置,
(2)在配置完成的環境中運行task1_1.py,將輸出結果截圖放入答題卡對應位置,
o 任務2:Anaconda 3、scikit-learn、OpenCV 3.X、TensorFlow 2.x庫的安裝與配置,
要求(1)需使用比賽平臺提供的上述各軟體安裝包進行安裝與配置,
(2)在配置完成的環境中運行task1_2.py,將輸出結果截圖放入答題卡對應位置,
任務一:
代碼:
#task1_1.py
import torch
import sys
import sklearn
print(sys.version)
print(torch.__version__)
print("Sklearn verion is {}".format(sklearn.__version__))
x1 = torch.zeros(3, 4)
print("x1 :",x1)
y1 = torch.rand(3, 4)
print("y1 : ", y1)
print("x1 + y1 :", x1 + y1)
運行結果:

任務二:
代碼:
# task1_2.py
import tensorflow as tf
import sys
import sklearn
import cv2
print(sys.version)
print(tf.__version__)
print("Sklearn verion is {}".format(sklearn.__version__))
print(cv2.__version__)
vec_1=tf.constant([1,2,2,1])
vec_2=tf.constant([7,8,9,9])
ver_add=tf.add(vec_1,vec_2)
print(ver_add)
運行結果:

第二部分:樣本資料預處理(30分)
o 任務:按照要求對給定csv格式資料進行處理,
task2.csv檔案為本題的資料檔案,利用Python撰寫代碼完成以下任務:
(1)分別求取Max TemperatureF和Min TemperatureF兩個特征的均值和方差,
(2)對Mean TemperatureF特征進行標準化,輸出標準化之后的Mean TemperatureF特征的均值,
標準化采用計算公式如下:

其中,x表示標準化之前的特征,x'表示標準化之后的特征,
說明:將代碼源檔案與運行結果截圖放入答題卡對應位置,
題(1)代碼:
import pandas as pd
df = pd.read_csv("task2.csv")
# print(df.head())
res_mean = df[['Max TemperatureF', 'Min TemperatureF']].mean()
print(res_mean)
res_var = df[['Max TemperatureF', 'Min TemperatureF']].var()
print(res_var)
運行結果:
均值:
Max TemperatureF 50.988764
Min TemperatureF 42.000000
dtype: float64
方差:
Max TemperatureF 82.625226
Min TemperatureF 83.436620
dtype: float64
題(2)代碼:
import pandas as pd
df = pd.read_csv("task2.csv")
data = df['Mean TemperatureF']
data2 = (data-data.min())/(data.max()-data.min()) # 即簡單實作標準化
print("標準化后的Mean TemperatureF特征的均值為:%s" % data2.mean())
運行結果:
![]()
第三部分:傳統機器學習演算法設計及應用(20分)
o 任務:根據要求補全對應演算法代碼,
task3.txt為本題的資料檔案,其內容為我國部分城市的經緯度坐標,task3.py為本題的代碼檔案,要求完成以下兩個任務:
(1)根據經緯度坐標將所有資料利用Kmeans演算法聚為10類;
(2)將聚類結果進行可視化(每一個城市表示為2維坐標平面的一個點,每一類中的點用同一種顏色,不同類的點采用不同顏色),
說明:將所補充代碼源檔案與運行結果截圖放入答題卡對應位置,
代碼:
# 繪制散點圖
def fig_scatter(exdata, title='China'):
plt.scatter(exdata[:, 0], exdata[:, 1], s=10)
plt.title(title)
plt.xlabel('經度')
plt.ylabel('緯度')
fig_scatter(X)
plt.show()
# 將sklearn輸出的結果變為字典形式
def trans(resu):
redict = {}
for ire in range(len(resu)):
try:
redict[resu[ire]].append(ire)
except KeyError:
redict[resu[ire]] = [ire]
return redict
# 繪制演算法后的類別的散點圖
def sca(Xdata, signdict,
co=['r', 'g', 'y', 'b', 'c', 'm', '#000080', '#006400','#00CED1', '#800000', '#800080',
'#CD5C5C', '#DAA520', '#E6E6FA', '#F08080', '#FFE4C4'],
marker=['o', '^', 'H', 's', 'd', '*', 'v', '8', 'p', 'D', 'h', '+', '1', '2', '3', '4'],
title='China'):
for jj in signdict:
xdata = Xdata[signdict[jj]]
plt.scatter(xdata[:, 0], xdata[:, -1], c=co[jj], s=20, marker=marker[jj], label='%d類' % jj) # 繪制樣本散點圖
plt.legend(bbox_to_anchor=(1.2, 1))
plt.title(title)
plt.xlabel('經度')
plt.ylabel('緯度')
# Sklearn
sk = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10)
train = sk.fit(X)
result = sk.predict(X)
skru = trans(result)
sca(X, skru, title='China')
plt.show()
運行結果:


第四部分:深度學習演算法設計及應用(15分)
o 任務:圖片回歸模型訓練,
給定資料為一批人臉圖片及每一張人臉對應的年齡標簽資料,現要求把所有已給的資料當作訓練集訓練一個基于卷積神經網路的人臉年齡預測模型,
要求與說明:
(1)本體旨在考察參賽者使用深度學習庫解決具體計算機視覺問題的完整流程,不以測驗集準確率作為評分標準;
(2)輸入網路的資料尺寸統一縮放到64*64*3;
(3)使用Adam優化器;
(4)使用均方誤差損失函式(MSE);
(5)代碼能正常運行,輸出每一次迭代的損失值情況;
(6)使用深度學習庫PyTorch或Tensorflow均可;
(7)卷積神經網路的結構如下:
| 層名稱 | 引數配置 |
| 輸入層 | 64*64*3 |
| 卷積層1 | 共8個3*3的卷積核,步長為1,無padding |
| 非線性映射層1 | 非線性映射函式為Relu |
| 池化層1 | 最大值池化,核2*2,步長為2 |
| 卷積層2 | 共16個3*3的卷積核,步長為1,無padding |
| 非線性映射層2 | 非線性映射函式為Relu |
| 池化層2 | 最大值池化,核2*2,步長為2 |
| 卷積層3 | 共32個3*3的卷積核,步長為1,無padding |
| 非線性映射層3 | 非線性映射函式為Relu |
| 池化層3 | 最大值池化,核2*2,步長為2 |
| 全連接層1 | 128個神經元+ Relu非線性映射 |
| Dropout | 激活概率為0.5 |
| 全連接層2 | 1個神經元+ Relu非線性映射 |
(8)需提交所有代碼及成功訓練運行截圖,
import os
import cv2
import numpy as np
import tensorflow as tf
# 設定路徑
data_home = 'imgdata/'
# 標簽映射字典
image_to_label = {}
with open('label.txt', 'r') as fr:
lines = fr.readlines()
for line in lines:
line = line.strip()
key, value = line.split(' ')
image_to_label[key] = value
# 構造訓練集
X_train = []
y_train = []
for jpg in os.listdir(data_home):
image = cv2.imread(data_home + jpg)
x = cv2.resize(image, (64, 64))
X_train.append(x)
y = image_to_label[jpg]
y_train.append(y)
X_train = np.array(X_train).astype('float16')/255.0
print(X_train.shape)
y_train = np.array(y_train).reshape((-1, 1)).astype('float16')
print(y_train.shape)
# print(X_train)
# print(y_train)
model = tf.keras.models.Sequential([
# 卷積層1
tf.keras.layers.Conv2D(8, 3, activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2), 2),
# 卷積層2
tf.keras.layers.Conv2D(16, 3, activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2), 2),
# 卷積層3
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2), 2),
# 全連接層1
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.5),
# 輸出層
tf.keras.layers.Dense(1, activation='relu')
])
model.compile(optimizer='adam',
loss='mean_squared_error')
model.fit(X_train, y_train, epochs=5)
運行結果:

第五部分:人工智能技術綜合應用(20分)
o任務:根據房源資訊,預測房屋價格,(資料為train.CSV, val.CSV, test.CSV)
房源資訊包括:電梯情況|樓層|戶型|區域|裝修情況|面積|建筑時間|,
注:部分資訊有缺失,訓練集:驗證集:測驗集=17000:3000:3000
!要求與說明:
(1)根據訓練集資料訓練一個房屋出租價格預測模型,
(2)按解決問題的順序詳細介紹每一步的目的,并給出相應代碼,放入答題卡對應位置,
(3)計算在驗證集表現最好的模型在測驗集資料的預測結果,將輸出結果放入答題卡對應位置(輸出結果保存為txt格式并命名為task5result.txt,不能截圖),
輸出txt格式的資料每一行是測驗集對應房源的預測價格(一定要符合格式要求,否則自動評分程式無法正確執行)
例:
800
120
615
…
(共3000行)
注:最終需要在規定位置提交的檔案包括答題卡和task5result.txt,
代碼:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:zsw
@file:house_price_forecast.py
@time:2021/10/15
@function:功能介紹
"""
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler # 資料標準化
from sklearn.preprocessing import LabelEncoder # 字串型資料編碼
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
# 公共部分:模型評價體系evaluation
# 構建回歸模型的評價體系并存盤在evaluation中,方便對比查看,全域變數
# MSE:Mean Squared Error
evaluation = pd.DataFrame({'Model': [],
'R^2 (train)': [],
'R^2 (test)': []})
# 缺失值處理
# 填充elevator資料 根據現實可以估計大概樓層大于六樓有電梯,否則沒有電梯進行缺失值得填充(利用apply函式進行操作)
def elevator_process(floor):
if floor > 6:
return "有電梯"
else:
return "無電梯"
def data_preprocess(filename):
# 利用pandas直接讀取已有的資料集
df = pd.read_csv(filename, delimiter=',', encoding='gbk')
# 填充缺失值
df["Elevator"] = df["Floor"].apply(elevator_process)
# 資料集中有字串型資料,使用labelEncoder處理
le = LabelEncoder() # 將標簽值統一轉換成range(標簽值個數-1)范圍內
data = [] # 用于存盤標簽轉換后的資料集
if filename == './test.csv':
for i in range(df.shape[1]):
data.append(le.fit_transform(df.iloc[:, i]))
# 資料集標準化
# 為保證快速收斂,所以將資料標準化
stand = StandardScaler() # 標準化,先計算均值與標準差,再進行轉化
data_std = stand.fit_transform(np.array(data).T) # 先fit再transform
X = data_std
# print(X[0])
return X, df
else:
for i in range(df.shape[1] - 1):
data.append(le.fit_transform(df.iloc[:, i]))
# print(data)
# 資料集標準化
# 為保證快速收斂,所以將資料標準化
stand = StandardScaler() # 標準化,先計算均值與標準差,再進行轉化
data_std = stand.fit_transform(np.array(data).T) # 先fit再transform
X = data_std
# print(X[0])
y = df['Price']
return X, y, df
def train_data(model_select, method_use, X_train, y_train, X_val, y_val):
"""
:param model_select: 選取的帶有不同引數模型
:param method_use: 模型求解的方法
:param X_train: 訓練集
:param y_train: 訓練集的目標
:param X_val: 驗證集
:param y_val: 驗證集的目標
:return: 模型的評價指標
"""
# 呼叫回歸模型進行模型訓練、預測
model = model_select
model.fit(X_train, y_train) # 模型訓練
y_train_predict = model.predict(X_train) # 模型預測
# print(y_train_predict)
y_test_predict = model.predict(X_val)
# print(y_test_predict)
# 計算訓練集和測驗集的MSE和決定系數R2
# MSE_train = mean_squared_error(y_train, y_train_predict)
# MSE_test = mean_squared_error(y_val, y_test_predict)
R2_score_train = model.score(X_train, y_train)
R2_score_test = model.score(X_val, y_val)
print("模型(%s)的訓練集的決定系數R^2: %0.3f" % (method_use, R2_score_train))
print("模型(%s)驗證集的決定系數R^2: %0.3f" % (method_use, R2_score_test))
# 將線性回歸模型計算的相關評價指標存入evaluation中,便于查看
r = evaluation.shape[0]
evaluation.loc[r] = ['回歸模型({})'.format(method_use), R2_score_train, R2_score_test]
return evaluation
def regression_with_diff_methods(model_select, method_use, X_train, y_train, X_test, y_test):
train_data(model_select, method_use, X_train, y_train, X_test, y_test)
def test_data_predict(rf, X_train, y_train, X_test):
model = rf
model.fit(X_train, y_train) # 模型訓練
y_test_predict = model.predict(X_test) # 模型預測
print(y_test_predict)
f = open("task5result.txt", "w")
for i in y_test_predict:
f.write(str(i) + '\n')
f.close()
if __name__ == '__main__':
# 資料讀取、判斷資料集是否有空值,資料集標簽數值化、資料標準化
X_train, y_train, df_train = data_preprocess('./train.csv')
X_val, y_val, df_val = data_preprocess('./val.csv')
X_test, df_test = data_preprocess('./test.csv')
lr = LinearRegression()
method_use = '線性回歸'
regression_with_diff_methods(lr, method_use, X_train, y_train, X_val, y_val)
print('\n')
dt = DecisionTreeRegressor()
method_use = '決策樹回歸'
regression_with_diff_methods(dt, method_use, X_train, y_train, X_val, y_val)
print('\n')
rf = RandomForestRegressor()
method_use = '隨機森林回歸'
regression_with_diff_methods(rf, method_use, X_train, y_train, X_val, y_val)
print('\n')
model_parameters = {
'n_estimators': 500,
'max_depth': 5,
'min_samples_split': 5,
'learning_rate': 0.01,
'loss': 'ls'
}
gbReg = GradientBoostingRegressor(**model_parameters)
method_use = '梯度決策提升樹回歸'
regression_with_diff_methods(gbReg, method_use, X_train, y_train, X_val, y_val)
# 經過評估對比,選擇 梯度隨機森林回歸 演算法進行預測
test_data_predict(rf, X_train, y_train, X_test)
print("代碼運行結束!")
題5在特征工程部分基本沒做什么處理,可再做些處理,預測的結果應該會更好,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339030.html
標籤:AI
