更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
(填空题, 15分)

本试题将创建一个新线程,实现对某共享数据的访问操作,并且在操作过程中应遵守线程锁的使用原则。请填充若干空缺的代码,使之能够按照要求运行并输出期望的结果。

#############################################

创建新线程并且遵守锁规则来访问共享数据

在main.py文件中,根据上下文,填写空缺的6处内容(小题编号【1】、【2】、【3】、【4】、【5】、【6】):



import threading

import time


# 定义线程锁

lock = threading.Lock()


# 定义计数器对象

class Counter:

    def __init__(self):

        self.data = 0


# 自定义线程类

class MyThread(threading.Thread):    

    def __init__(self, counter):

        threading.Thread.__init__(self)

        # 将传入的counter赋值给本类实例属性

        self.counter = counter

    

    ######(1)定义线程的操作函数######

    def ____【1】____(self):        

        ######(2)获取一个锁资源######

        lock.____【2】____()

        print("新线程操作开始...")

        self.counter.data += 1

        ######(3)当前线程休眠3秒######

        time.____【3】____     

        self.counter.data += 1

        print("新线程操作结束...")

        # 写线程执行完毕,释放锁

        lock.____【4】____()


# 主函数

if __name__ == "__main__":

    # 创建计数器对象

    counter = Counter()

    # 创建新线程对象

    new_thread = MyThread(counter)

    ######(5)启动新线程######

    new_thread.____【5】____()

    

    print("主线程运行中...")


    ######(6)等待新线程运行完毕######

    new_thread.____【6】____()


    print("新线程运行完毕,数据值:", counter.data)


(填空题, 25分)

本试题要求读取一个数据集,针对给定的字段,获取初步的描述性统计信息,绘制样本数量统计结果图,并观察字段之间的相关性。



import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


# 装载数据集,打印前5行数据值

df = pd.read_csv('dataset/vehicle.csv')

print(df.head())

print("=" * 100)


################################################################################

# 任务1:使用柱状图展现每个制造商(maker)的样本数量

################################################################################

print('【任务1开始】', '=' * 100)


maker_counts = df['maker'].____【1】____()    # 统计样本中每种maker的数量

x = maker_counts.index    # 以maker_counts的索引(即制造商名称)为横坐标

y = maker_counts.____【2】____   # 以maker_counts的值(统计的样本数)为纵坐标


plt.figure(figsize=(16,6))

plt.____【3】____(x, y)     # 绘制柱状图

plt.xticks(rotation=30)             # 设置x轴上的文本标记倾斜30度

# 在每个柱块上以文字形式标出样本数量

for i in range(len(x)):

    plt.text(i, y[i] + 0.05, '%.0f' % y[i], ha='center', va='bottom', fontsize=14)


plt.show()


print('【任务1结束】', '=' * 100)

################################################################################

# 任务2:使用直方图展现每个价格(price)区间的样本数量

################################################################################

print('【任务2开始】', '=' * 100)


bins = 10    # 共分为10个区间进行统计

bin_range = (df['price'].min(),df['price'].max())    # 获取最小值和最大值边界

price_sorted =  np.sort(df['price'])    # 将价格数据升序排列


plt.figure(figsize=(10,6))

plt.____【4】____(price_sorted, ____【5】____=bins, range=bin_range, rwidth=0.5)    # 分成bins个区间绘制直方图


plt.show() 


print('【任务2结束】', '=' * 100)




################################################################################

# 任务3:计算length字段的描述性统计信息

################################################################################

print('【任务3开始】', '=' * 100)


length_data = df['length'].values    # 获取length字段的所有样本数据,存储在数组中

result_zhongweishu = np.____【6】____(length_data)    # 计算中位数

result_biaozhuncha = np.____【7】____(length_data)       # 计算标准差

result_IQR = np.____【8】____(length_data, 0.75) - np.percentile(length_data, 0.25)    # 计算四分位距离

print("中位数:%.2f, 标准差:%.2f, 四分位距离:%.2f", result_zhongweishu, result_biaozhuncha, result_IQR)


print('【任务3结束】', '=' * 100)




################################################################################

# 任务4:绘制两两字段之间相关性热力图,并指出与highway-mpg相关性最大的字段名称

################################################################################

print('【任务4开始】', '=' * 100)


import seaborn as sns

plt.figure(figsize=(10,10))

sns.____【9】____(df.corr(), annot=True, fmt='.1f', square=True)

plt.show()

# 与highway-mpg字段相关性最大的字段名称为:____【10】____


(填空题, 25分)数据集advertising.csv中包含4个字段,前3个字段(特征)分别表示通过电视(TV)、广播(radio)和报纸(newspaper)投放的广告金额,第4个字段(标签结果)表示因广告投放而获得的销售收入。

针对该数据集进行必要的探查和预处理,训练一个线性回归模型,预测新样本数据,最后计算模型性能。


import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


# 装载数据集,打印前5行数据值

df = pd.read_csv('dataset/advertising.csv') 

print(df.head())

print("数据集维度:", df.shape)

print("=" * 100)


################################################################################

# 任务1:查看和分析特征与结果之间的关系

# 绘制每个特征与结果之间的散点图分布并给出分析结果

################################################################################

print('【任务1开始】', '=' * 100)


# 前三个字段作为特征,依次绘制散点图

for column_name in df.columns[:-1]:

    plt.scatter(df[column_name], df['sales'])

plt.legend(df.columns[:-1])    # 显示三个特征的图例文字

plt.show()

# 从上述图形输出结果可以发现,下列三种广告投放手段中,

# 哪一种方式的性价比比较低(销售额与投入额度的比值相对较小)?____【1】____

# (A)TV  (B)radio  (C)newspaper


print('【任务1结束】', '=' * 100)


################################################################################

# 任务2:拆分训练数据集和测试数据集

# 按照7:3的比例拆分训练集和测试集

################################################################################

print('【任务2开始】', '=' * 100)


# 将原始样本按照7:3的比例拆分训练集和测试集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(

    df.iloc[:, :-1], df.____【2】____[:, 'sales'], test_size=0.2, random_state=100

)

print("训练特征集的维度:", X_train.shape)

print("测试特征集的维度:", X_test.shape)


print('【任务2结束】', '=' * 100)


################################################################################

# 任务3:执行归一化处理

# 将所有特征字段进行最大最小归一化处理

################################################################################

print('【任务3开始】', '=' * 100)


# 计算各个特征的最大值和最小值

X_max = X_train.max()

X_min = X_train.min()


# 定义用于执行最大最小归一化操作的函数

# x:输入的特征数据集

# min:包含每个特征的最小值的集合

# max: 包含每个特征的最大值的集合

# 返回值:执行完归一化操作的输出特征数据集

def calc_scaler(x, min, max):

    return (___【3】___ - ____【4】____) / (max - ____【5】____)


X_train= calc_scaler(X_train, X_max, X_min)      # 针对训练数据执行归一化操作

X_test= calc_scaler(X_test, X_max, X_min)        # 针对测试数据执行归一化操作   


print(X_train.head())


print('【任务3结束】', '=' * 100)


################################################################################

# 任务4:建立机器学习模型并执行预测

# 构建线性回归模型,对sales字段进行预测

################################################################################

print('【任务4开始】', '=' * 100)


from sklearn.linear_model import LinearRegression

model = LinearRegression()

# 训练模型

model.fit(X_train, y_train)

# 对测试数据集中的第一个样本进行预测

test_data = X_test.iloc[:____【6】____, :]

predict = model.predict(test_data)

print("第一个测试样本的预测结果:%.2f" % predict)


print('【任务4结束】', '=' * 100)



################################################################################

# 任务5:评估模型性能

# 使用测试数据集,计算模型的MAE和R方

################################################################################

print('【任务5开始】', '=' * 100)


from sklearn.metrics import r2_score

# 对所有测试样本进行预测

y_test_predict = model.predict(X_test)

# 计算测试数据的MAE

mae = np.mean(np.____【7】____(y_test - ____【8】____))

# 计算测试数据的R方

r2 = r2_score(y_true=____【9】____, y_pred=____【10】____)

print("测试数据集的MSE=%.2f" % mae)

print("测试数据集的R方=%.2f" % r2)


print('【任务5结束】', '=' * 100)


(填空题, 25分)

数据集breast-cancer.csv记录了一批曾经罹患乳腺癌患者的数据。每个样本包含下列字段(第1个字段是标签字段,其余为特征字段):

    class:分类标签,共2类。1代表复发,0代表没有复发。

    age:年龄,共六个区间。0代表20-29岁区间, 1代表30-39岁,2代表40-49岁,3代表50-59岁,4代表60-69岁,5代表70-79岁。

    menopause:绝经期,共三种取值:prememo(未绝经),ge40(40岁之后绝经),lt40(40岁之前绝经)

    tumor-size:肿瘤大小,按照大小划分为11个区间。例如:0代表0-4区间,1代表5-9区间,2代表10-14区间,3代表15-19区间,4代表20-24区间,5代表25-29区间,6代表30-34区间,7代表35-39区间,8代表40-44区间,9代表45-49区间,10代表50-54区间。

    inv-nodes:淋巴结个数,按照数量划分为9个区间。例如:0代表0-2区间,1代表3-5区间,2代表6-8区间,3代表9-11区间,4代表12-14区间,5代表15-17区间,6代表18-20区间,7代表21-23区间,8代表24-26区间

    node-caps:结节冒有无。0表示没有,1表示有。

    deg-malig:肿瘤恶性程度,分为1、2、3三种,3恶性程度最高

    breast: 病灶的左右位置。0表示分为左胸,1表示右胸。

    breast-quad:病灶所在的象限。0表示中间,1表示右上,2表示左上,3表示左下,4表示右下。

    irradiat:是否有放射性治疗经历。0表示没有,1表示有。

针对该数据集进行必要的数据探查和预处理,然后训练一个逻辑回归模型,最后计算模型性能。


import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


# 装载数据集,打印前5行数据值

df = pd.read_csv('dataset/breast_cancer.csv')

print(df.head())

print("原始数据集维度:", df.shape)

print("=" * 100)


################################################################################

# 任务1:拆分训练集和测试集 

################################################################################

print('【任务1开始】', '=' * 100)


# 将原始样本按照7:3的比例拆分训练集和测试集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(

    df.____【1】____[:, 1:], df.iloc[:, 0], test_size=0.3, random_state=100)

print("训练特征集的维度:", X_train.shape)

print("测试特征集的维度:", X_test.shape)


print('【任务1结束】', '=' * 100)


################################################################################

# 任务2:以饼图形式查看训练集和测试集中,每种类别的样本占比

################################################################################

print('【任务2开始】', '=' * 100)


plot_index = 1

for y, title in [(y_train, 'train'), (y_test, 'test')]:

    plt.subplot(1, 2, plot_index)

    plt.title(title)

    y_counts = y.value_counts()

    plt.pie(y_counts.values / y_counts.values.____【2】____(),

        labels = ['class=0', 'class=1'],    # 显示的标签文本

        autopct='%.1f%%',    # 样本的比例数值保留一位小数

        textprops = {'fontsize':14, 'color':'black'}    # 文本标签的属性

    )

    plot_index += 1

plt.show()


print('【任务2结束】', '=' * 100)


################################################################################

# 任务3:对特征进行OneHot数值化处理

################################################################################

print('【任务3开始】', '=' * 100)


# 将menopause字段从文本转换成OneHot编码的0-1数值字段

import sklearn.preprocessing

onehot_encoder = sklearn.preprocessing.____【3】____()

onehot_encoder.fit(X_train[['menopause']])          # 计算OneHot编码映射

menopause_names = onehot_encoder.categories_[0]     # 获取OneHot编码的字段名称

# 对训练数据进行OneHot编码,并将编码后的若干个字段保存到训练特征集中

X_train['menopause_' + menopause_names] = onehot_encoder.transform(X_train[['menopause']]).toarray()

# 对测试数据进行OneHot编码,并将编码后的若干个字段保存到测试特征集中

X_test['menopause_' + menopause_names] = onehot_encoder.transform(X_test[['menopause']]).toarray()


# 从训练特征集和测试特征集中删除menopause字段

for X in [X_train, X_test]:

    X.____【4】____((['menopause'], axis=1, inplace=True)


print("任务3完成后,训练特征集前5行样本:")

print(X_train.head())


print('【任务3结束】', '=' * 100)


################################################################################

# 任务4:训练逻辑回归模型,并对测试数据进行预测

################################################################################

print('【任务4开始】', '=' * 100)


from sklearn.linear_model import LogisticRegression

# 构建LogisticRegression对象,并设置正则化惩罚系数为0.1

model = LogisticRegression(____【5】____=0.1)

model.fit(X_train, y_train)

# 使用判别式计算结果

decision_results = model.decision_function(X_test)

# 将计算结果转换成为分类结果(0或1)

y_test_predict = (decision_results ____【6】____ 0).astype(np.int32)

print("测试样本的预测结果(前5个):",  y_test_predict[:5])


print('【任务4结束】', '=' * 100)


################################################################################

# 任务5:针对测试数据,计算性能指标

################################################################################

print('【任务5开始】', '=' * 100)


from sklearn.metrics import precision_score

precision = precision_score(y_true=____【7】, y_pred=____【8】____)        # 计算测试数据的精度(Precision)

accuracy = model.score(____【9】____, ____【10】____)            # 计算测试数据的预测正确率(Accuracy)

print("测试数据集的Precision=%.2f" % precision)

print("测试数据集的Accuracy=%.2f" % accuracy)


print('【任务5结束】', '=' * 100)


(填空题, 10分)

目前已经训练好一个线性回归(LinearRegression)模型,该模型包括两个特征:面积(Area)和房间数量(Rooms),根据这两个特征拟合出结果:价格(Price)。因为这两个特征的均值、方差差异均很大,因此对特征分别进行了标准化(StandardScaler)处理。

该模型已经通过joblib库保存到house_price_model.m文件中;而训练数据集特征标准化处理的参数(各特征的均值、方差)也已经直接在程序代码中给出。

请从.m文件装载并还原成模型,然后针对给定的待预测样本,进行标准化处理,并计算出预测的价格值。



import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


################################################################################

# 任务1:装载模型

################################################################################

print('【任务1开始】', '=' * 100)


import joblib

model_file = './house_price_model.m'

model = joblib.____【1】____(model_file) 


print('【任务1结束】', '=' * 100)


################################################################################

# 任务2:为待预测样本执行标准化操作

################################################################################

print('【任务2开始】', '=' * 100)


# 待预测样本,每行代表一个样本,第一列为Area特征值,第二列为Rooms特征值

origin_test_data = np.array([[1200, 3], [1858, 4]])

# 模型训练样本中Area和Rooms字段的平均值

mean_params = [2001, 3.17]

# 模型训练样本中Area和Rooms字段的方差

var_params = [618115,0.567]

# 对测试样本进行标准化处理

test_data_= (____【2】____ - ____【3】____) / np.sqrt(____【4】____)


print('【任务2结束】', '=' * 100)


# 对标准化后的待预测样本进行计算,预测其可能的价格

predicts = model.intercept_ + np.dot(test_data_, model.coef_)

print("测样本的预测价格:", predicts)