当前位置:   article > 正文

数据挖掘与分析部分实验与实训项目报告

数据挖掘与分析部分实验与实训项目报告

一、机器学习算法的应用

1. 朴素贝叶斯分类器

相关代码

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.naive_bayes import GaussianNB, MultinomialNB
  4. from sklearn.metrics import accuracy_score
  5. # 将数据加载到DataFrame中,删除ID和ZIP Code列
  6. df = pd.read_csv('universalbank.csv')
  7. df = df.drop(columns=['ID', 'ZIP Code'])
  8. # 以下是使用高斯朴素贝叶斯分类器的代码
  9. # 分离特征和目标变量
  10. X = df.drop(columns=['Personal Loan'])
  11. y = df['Personal Loan']
  12. # 划分数据集
  13. # X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  14. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
  15. # 创建高斯朴素贝叶斯分类器实例
  16. gnb = GaussianNB()
  17. # 训练模型
  18. gnb.fit(X_train, y_train)
  19. # 预测测试集
  20. y_pred = gnb.predict(X_test)
  21. # 输出预测结果和模型准确度
  22. print("高斯朴素贝叶斯分类器的预测结果:", y_pred)
  23. print("高斯朴素贝叶斯分类器的准确度:", accuracy_score(y_test, y_pred))
  24. # 以下是使用多项式朴素贝叶斯分类器的代码
  25. # 筛选出离散型特征
  26. X_discrete = df[['Family', 'Education', 'Securities Account', 'CD Account', 'Online', 'CreditCard']]
  27. # 划分数据集
  28. # X_train_discrete, X_test_discrete, y_train, y_test = train_test_split(X_discrete, y, test_size=0.3, random_state=42)
  29. X_train_discrete, X_test_discrete, y_train, y_test = train_test_split(X_discrete, y, test_size=0.3, random_state=0)
  30. # 创建多项式朴素贝叶斯分类器实例
  31. mnb = MultinomialNB()
  32. # 训练模型
  33. mnb.fit(X_train_discrete, y_train)
  34. # 预测测试集
  35. y_pred_discrete = mnb.predict(X_test_discrete)
  36. # 输出预测结果和模型准确度
  37. print("多项式朴素贝叶斯分类器的预测结果:", y_pred_discrete)
  38. print("多项式朴素贝叶斯分类器的准确度:", accuracy_score(y_test, y_pred_discrete))

运行结果

2.K近邻分类器(KNN)

相关代码

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.neighbors import KNeighborsClassifier
  4. from sklearn.metrics import accuracy_score
  5. # 将数据加载到DataFrame中,删除ID和ZIP Code列
  6. df = pd.read_csv('universalbank.csv')
  7. df = df.drop(columns=['ID', 'ZIP Code'])
  8. # 分离特征和目标变量
  9. X = df.drop(columns=['Personal Loan'])
  10. y = df['Personal Loan']
  11. # 划分数据集
  12. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
  13. # 创建KNN分类器实例,设置最近邻的数量K为5
  14. knn = KNeighborsClassifier(n_neighbors=5)
  15. # 训练模型
  16. knn.fit(X_train, y_train)
  17. # 预测测试集
  18. y_pred = knn.predict(X_test)
  19. # 输出预测结果和模型准确度
  20. print("KNN分类器的预测结果:", y_pred)
  21. print("KNN分类器的准确度:", accuracy_score(y_test, y_pred))

运行结果

3. CART决策树

相关代码

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.tree import DecisionTreeClassifier
  4. from sklearn.metrics import accuracy_score
  5. from sklearn.tree import export_graphviz
  6. import graphviz
  7. # 将数据加载到DataFrame中,删除ID和ZIP Code列
  8. df = pd.read_csv('universalbank.csv')
  9. df = df.drop(columns=['ID', 'ZIP Code'])
  10. # 分离特征和目标变量
  11. X = df.drop(columns=['Personal Loan'])
  12. y = df['Personal Loan']
  13. # 划分数据集
  14. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
  15. # 创建CART决策树分类器实例,设置决策树的深度限制为10层
  16. dt = DecisionTreeClassifier(max_depth=10, random_state=42)
  17. # 训练模型
  18. dt.fit(X_train, y_train)
  19. # 预测测试集
  20. y_pred = dt.predict(X_test)
  21. # 输出预测结果和模型准确度
  22. print("CART决策树分类器的预测结果:", y_pred)
  23. print("CART决策树分类器的准确度:", accuracy_score(y_test, y_pred))
  24. # 可视化训练好的CART决策树模型
  25. dot_data = export_graphviz(dt, out_file=None,
  26. feature_names=X.columns,
  27. class_names=['0', '1'],
  28. filled=True, rounded=True,
  29. special_characters=True)
  30. graph = graphviz.Source(dot_data)
  31. graph.render("universalbank_decision_tree") # 保存为PDF文件
  32. graph.view() # 在默认PDF查看器中打开

运行结果

4.神经网络回归任务

相关代码

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.neural_network import MLPRegressor
  5. data = pd.read_csv('house-price.csv')
  6. X = data.iloc[:, 2:14]
  7. y = data.iloc[:, [1]]
  8. # 划分数据集,70%为训练集,30%为测试集
  9. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
  10. # 创建多层感知机回归模型实例,设置隐藏层层数和神经元数量
  11. regressor = MLPRegressor(hidden_layer_sizes=(100, 10), activation="relu")
  12. # 使用训练集数据训练模型
  13. regressor.fit(X_train, y_train)
  14. # 使用训练好的模型对测试集进行预测
  15. y_pred = regressor.predict(X_test)
  16. # 计算模型的均方误差(MSE)
  17. mse = np.sum(np.square(y_pred - y_test.values)) / len(y_test)
  18. # 计算模型的平均绝对误差(MAE)
  19. mae = np.sum(np.abs(y_pred - y_test.values)) / len(y_test)
  20. # 输出测试数据的预测结果和模型的MSE和MAE
  21. print('测试数据的预测结果:', y_pred)
  22. print("预测结果和模型的MSE:", mse)
  23. print("预测结果和模型的MAE:", mae)
  24. # 使用训练好的模型对给定的数据进行房价预测
  25. y_ = regressor.predict(np.array([[3.0, 2.5, 1490, 8102, 2.0, 0, 0, 4, 1490, 0, 1990, 0]]))
  26. print('数据[3.0,2.5,1490,8102,2.0,0,0,4,1490,0,1990,0]的预测结果为:', y_)

运行结果

5.神经网络分类任务

相关代码

  1. import pandas as pd
  2. from sklearn.neural_network import MLPClassifier
  3. from sklearn.metrics import accuracy_score
  4. # 将数据加载到DataFrame中
  5. df = pd.read_excel('企业贷款审批数据表.xlsx')
  6. # 选择特征列和目标列
  7. X = df.iloc[:, 1:4] # 特征列X1, X2, X3
  8. y = df.iloc[:, 4] # 目标列Y
  9. # 使用前10行数据作为训练集,11-20行数据作为测试集
  10. X_train = X.iloc[:10]
  11. y_train = y.iloc[:10]
  12. X_test = X.iloc[10:20]
  13. y_test = y.iloc[10:20]
  14. # 创建MLP分类模型实例,设置隐藏层层数和神经元数量
  15. mlp = MLPClassifier(hidden_layer_sizes=(10,5), max_iter=1000, random_state=0,verbose=1)
  16. # 训练模型
  17. mlp.fit(X_train, y_train)
  18. # 使用训练好的模型对测试集进行预测
  19. y_pred = mlp.predict(X_test)
  20. # 计算模型的准确度
  21. accuracy = accuracy_score(y_test, y_pred)
  22. # 输出预测结果和模型准确度
  23. print("测试集的预测结果:", y_pred)
  24. print("模型准确度:", accuracy)
  25. # 使用训练好的模型对21-25行数据进行预测
  26. # 给定的数据
  27. new_data = df.iloc[20:, 1:4]
  28. predicted_results = mlp.predict(new_data)
  29. # 输出评估结果
  30. print("21-25行数据的评估结果:", predicted_results)

运行结果

6. 关联规则分析

相关代码

  1. import pandas as pd
  2. from mlxtend.preprocessing import TransactionEncoder
  3. from tabulate import tabulate
  4. from mlxtend.frequent_patterns import apriori, fpgrowth, association_rules
  5. # (2)数据读取与预处理
  6. data = pd.read_excel('tr.xlsx', keep_default_na=False)
  7. # 将数据转换为适合TransactionEncoder的格式
  8. te = TransactionEncoder()
  9. te_ary = te.fit(data.values).transform(data.values)
  10. # 创建DataFrame
  11. df = pd.DataFrame(te_ary, columns=te.columns_)
  12. # 剔除第3列到第6列
  13. df = df.drop(columns=df.columns[0:9])
  14. # 将True和False替换为1和0
  15. df = df.replace({True: 1, False: 0})
  16. # 使用tabulate库打印DataFrame
  17. # print(tabulate(df, headers='keys', tablefmt='psql'))
  18. # (3)使用apriori算法挖掘频繁项集(最小支持度为0.3)
  19. frequent_itemsets_apriori = apriori(df, min_support=0.3, use_colnames=True)
  20. # (4)使用FP-growth算法挖掘频繁项集(最小支持度为0.3)
  21. frequent_itemsets_fpgrowth = fpgrowth(df, min_support=0.3, use_colnames=True)
  22. # (5)生成强规则(最小置信度为0.5, 提升度>1)
  23. rules = association_rules(frequent_itemsets_apriori, metric='confidence', min_threshold=0.5, support_only=False)
  24. rules = rules[rules['lift'] > 1]
  25. # 输出结果
  26. print("频繁项集(Apriori算法):")
  27. # print(frequent_itemsets_apriori)
  28. print(tabulate(frequent_itemsets_apriori, headers='keys', tablefmt='psql'))
  29. print("\n频繁项集(FP-growth算法):")
  30. # print(frequent_itemsets_fpgrowth)
  31. print(tabulate(frequent_itemsets_fpgrowth, headers='keys', tablefmt='psql'))
  32. print("\n强规则:")
  33. print(rules)

运行结果

7.时间序列分析

相关代码

  1. import pandas as pd
  2. import warnings
  3. from matplotlib import MatplotlibDeprecationWarning
  4. import matplotlib.pyplot as plt
  5. from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
  6. from statsmodels.tsa.stattools import adfuller as ADF
  7. from statsmodels.tsa.arima.model import ARIMA
  8. # 屏蔽所有FutureWarning类型的警告
  9. warnings.filterwarnings("ignore", category=FutureWarning)
  10. warnings.filterwarnings("ignore", category=UserWarning, module="statsmodels")
  11. warnings.filterwarnings("ignore", category=MatplotlibDeprecationWarning)
  12. # 读取数据
  13. data = pd.read_csv('shampoo.csv')
  14. # 假设数据框中日期列名为'Month'
  15. data['Month'] = '2024-' + data['Month']
  16. # 如果需要转换为日期类型(可选)
  17. data['Month'] = pd.to_datetime(data['Month'], format='%Y-%m-%d')
  18. data.rename(columns={'Month': 'Date'}, inplace=True)
  19. # (3)检测序列的平稳性
  20. # 时序图判断法
  21. plt.rcParams['font.sans-serif'] = ['SimHei']
  22. plt.rcParams['axes.unicode_minus'] = False
  23. plt.plot(data['Sales'])
  24. plt.legend(['Sales'])
  25. plt.show()
  26. # 制自相关图判断法
  27. plot_acf(data['Sales'])
  28. plt.show()
  29. # 使用ADF单位根检测法
  30. print('原始序列的ADF检验结果为:', ADF(data['Sales']))
  31. # (4)差分处理
  32. # 注意:根据上一步结果判断数据序列为非平稳序列,如想使用模型对数据进行建模,
  33. # 则需将数据转换为平稳序列。所以在这一步使用差分处理对序列进行处理。
  34. Date_data = data['Sales'].diff().dropna()
  35. # 对处理后的序列进行平稳性检测(自相关图法、偏相关图法、ADF检测法)
  36. plot_acf(Date_data)
  37. plt.show()
  38. plot_pacf(Date_data)
  39. plt.show()
  40. print('差分序列的ADF检验结果为:', ADF(Date_data))
  41. # (5)使用ARIMA模型对差分处理后的序列进行建模
  42. # 选择合适的p和q值
  43. pmax = int(len(Date_data)/10)
  44. qmax = int(len(Date_data)/10)
  45. bic_matrix = []
  46. for p in range(pmax + 1):
  47. tmp = []
  48. for q in range(qmax + 1):
  49. try:
  50. tmp.append(ARIMA(data['Sales'].values, order=(p,1,q)).fit().bic)
  51. except:
  52. tmp.append(None)
  53. bic_matrix.append(tmp)
  54. bic_matrix = pd.DataFrame(bic_matrix)
  55. p, q = bic_matrix.stack().idxmin()
  56. print('BIC最小的p值和q值为:%s、%s' % (p, q))
  57. # 使用模型预测未来5个月的销售额
  58. model = ARIMA(data['Sales'].values, order=(p,1,q)).fit()
  59. print('模型基本报告', model.summary())
  60. print('预测未来5个月的销售额:', model.forecast(5))

运行结果

二、深度学习算法应用

1. TensorFlow框架的基本使用

(1)获取训练数据

构建一个简单的线性模型:W,b为参数,W=2,b=1,运用tf.random.normal() 产生1000个随机数,产生x,y数据。

用matplotlib库,用蓝色绘制训练数据。

  1. import tensorflow as tf
  2. import numpy as np
  3. import warnings
  4. from matplotlib import MatplotlibDeprecationWarning
  5. # 屏蔽所有FutureWarning类型的警告
  6. warnings.filterwarnings("ignore", category=FutureWarning)
  7. warnings.filterwarnings("ignore", category=UserWarning, module="statsmodels")
  8. warnings.filterwarnings("ignore", category=MatplotlibDeprecationWarning)
  9. W = 3.0 # W参数设置
  10. b =1.0 # b参数设置
  11. num = 1000
  12. # x随机输入
  13. x = tf.random.normal(shape=[num])
  14. # 随机偏差
  15. c = tf.random.normal(shape=[num])
  16. # 构造y数据
  17. y = W * x + b + c
  18. # print(x)
  19. # 画图观察
  20. import matplotlib.pyplot as plt #加载画图库
  21. plt.scatter(x, y, c='b') # 画离散图
  22. plt.show() # 展示图
(2)定义模型

通过对样本数据的离散图可以判断,呈线性规律变化,因此可以建立一个线性模型,即 ,把该线性模型定义为一个简单的类,里面封装了变量和计算,变量设置用tf.Variable()。

  1. #定义模型
  2. class LineModel(object): # 定义一个LineModel的类
  3. def __init__(self):
  4. # 初始化变量
  5. self.W = tf.Variable(5.0)
  6. self.b = tf.Variable(0.0)
  7. def __call__(self, x): #定义返回值
  8. return self.W * x + self.b
  9. def train(self, x, y, learning_rate): #定义训练函数
  10. with tf.GradientTape() as t:
  11. current_loss = loss(self.__call__(x), y) #损失函数计算
  12. # 对W,b求导
  13. d_W, d_b = t.gradient(current_loss, [self.W, self.b])
  14. # 减去梯度*学习率
  15. self.W.assign_sub(d_W*learning_rate) #减法操作
  16. self.b.assign_sub(d_b*learning_rate)
(3)定义损失函数

损失函数是衡量给定输入的模型输出与期望输出的匹配程度,采用均方误差(L2范数损失函数)。

  1. # 定义损失函数
  2. def loss(predicted_y, true_y): # 定义损失函数
  3. return tf.reduce_mean(tf.square(true_y - predicted_y)) # 返回均方误差值
(4)模型训练

运用数据和模型来训练得到模型的变量(W和b),观察W和b的变化(使用matplotlib绘制W和b的变化情况曲线)。

  1. # 求解过程
  2. model= LineModel() #运用模型实例化
  3. # 计算W,b参数值的变化
  4. W_s, b_s = [], [] #增加新中间变量
  5. for epoch in range(15): #循环15次
  6. W_s.append(model.W.numpy()) #提取模型的W参数添加到中间变量w_s
  7. b_s.append(model.b.numpy())
  8. print('model.W.numpy():',model.W.numpy())
  9. # 计算损失函数loss
  10. current_loss = loss(model(x), y)
  11. model.train(x, y, learning_rate=0.1) # 运用定义的train函数训练
  12. print('Epoch %2d: W=%1.2f b=%1.2f, loss=%2.5f' %
  13. (epoch, W_s[-1], b_s[-1], current_loss)) #输出训练情况
  14. # 画图,把W,b的参数变化情况画出来
  15. epochs = range(15) #这个迭代数据与上面循环数据一样
  16. plt.figure(1)
  17. plt.scatter(x, y, c='b') # 画离散图
  18. plt.plot(x,model(x),c='r')
  19. plt.figure(2)
  20. plt.plot(epochs, W_s, 'r',
  21. epochs, b_s, 'b') #画图
  22. plt.plot([W] * len(epochs), 'r--',
  23. [b] * len(epochs), 'b-*')
  24. plt.legend(['pridect_W', 'pridet_b', 'true_W', 'true_b']) # 图例
  25. plt.show()

运行结果

2. 多层神经网络分类

(1)数据获取与预处理

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据。

每张图像的大小都是28x28像素。MNIST数据集有60000张图像用于训练和10000张图像用于测试,其中每张图像都被标记了对应的数字(0-9)。

(2)加载数据集
  1. import tensorflow as tf
  2. import matplotlib.pyplot as plt
  3. # 1. 数据获取与预处理
  4. # 加载数据集
  5. mnist = tf.keras.datasets.mnist
  6. (x_train_all, y_train_all), (x_test, y_test) = mnist.load_data()
(3)查看数据集
  1. def show_single_image(img_arr):
  2. plt.imshow(img_arr, cmap='binary')
  3. plt.show()
  4. show_single_image(x_train_all[0])
(4)归一化处理
x_train_all, x_test = x_train_all / 255.0, x_test / 255.0

模型构建

(5)模型定义

  1. # 模型定义
  2. model = tf.keras.models.Sequential([
  3. #输入层
  4. tf.keras.layers.Flatten(input_shape=(28, 28)),
  5. #隐藏层1
  6. tf.keras.layers.Dense(256, activation=tf.nn.relu),
  7. #百分之20的神经元不工作,防止过拟合
  8. tf.keras.layers.Dropout(0.2),
  9. #隐藏层2
  10. tf.keras.layers.Dense(128, activation=tf.nn.relu),
  11. #隐藏层3
  12. tf.keras.layers.Dense(64, activation=tf.nn.relu),
  13. #输出层
  14. tf.keras.layers.Dense(10, activation=tf.nn.softmax)
  15. ])
(6)编译模型
  1. #定义优化器,损失函数,训练效果中计算准确率
  2. model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'])
(7)输出模型参数
  1. # 打印网络参数
  2. print(model.summary())

模型训练

(8)训练
  1. # 训练模型
  2. history = model.fit(x_train_all, y_train_all, epochs=50, validation_split=0.2, verbose=1)
(9)获取训练历史数据中的各指标值
  1. acc = history.history['sparse_categorical_accuracy']
  2. val_acc = history.history['val_sparse_categorical_accuracy']
  3. loss = history.history['loss']
  4. val_loss = history.history['val_loss']
(10)绘制指标在训练过程中的变化图
  1. plt.figure(1)
  2. plt.plot(acc, label='Training Accuracy')
  3. plt.plot(val_acc, label='Validation Accuracy')
  4. plt.title('Training and Validation Accuracy')
  5. plt.legend()
  6. plt.figure(2)
  7. plt.plot(loss, label='Training Loss')
  8. plt.plot(val_loss, label='Validation Loss')
  9. plt.title('Training and Validation Loss')
  10. plt.legend()
  11. plt.show()
(11)模型评估

使用测试集对模型进行评估

  1. loss, accuracy = model.evaluate(x_test, y_test, verbose=1)
  2. print(f"Test Loss: {loss}, Test Accuracy: {accuracy}")

3. 多层神经网络回归

(1)数据获取与预处理

Auto MPG 数据集,它记录了各种汽车效能指标MPG(Mile Per Gallon)与气缸数、重量、马力等因素的真实数据。除了产地的数字字段表示类别外,其他字段都是数值类型。对于产地地段,1 表示美国,2 表示欧洲,3 表示日本。

(2)加载数据集
  1. import pandas as pd
  2. import numpy as np
  3. import seaborn as sns
  4. import matplotlib.pyplot as plt
  5. from sklearn.preprocessing import StandardScaler
  6. from sklearn.model_selection import train_test_split
  7. from tensorflow.keras.models import Sequential
  8. from tensorflow.keras.layers import Dense
  9. column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',
  10. 'Acceleration', 'Model Year', 'Origin']
  11. raw_dataset = pd.read_csv('./data/auto-mpg.data', names=column_names,
  12. na_values="?", comment='\t',
  13. sep=" ", skipinitialspace=True)
(3)数据清洗
  1. # 数据清洗
  2. # 统计每列的空值数量
  3. null_counts = raw_dataset.isnull().sum()
  4. # 打印每列的空值数量
  5. print(null_counts)
  6. # 删除包含空值的行
  7. dataset = raw_dataset.dropna()

(4)将Origin列转换为one-hot(独热)编码。
dataset = pd.get_dummies(dataset, columns=['Origin'])
(5)数据探索
  • 使用describe方法查看数据的统计指标
  1. # 使用describe方法查看数据的统计指标
  2. dataset.describe()
  • 使用seaborn库中pairplot方法绘制"MPG", "Cylinders", "Displacement", "Weight"四列的联合分布图
  1. # 使用seaborn库中pairplot方法绘制"MPG", "Cylinders", "Displacement", "Weight"四列的联合分布图
  2. sns.pairplot(dataset[['MPG', 'Cylinders', 'Displacement', 'Weight']])
(6)数据可视化
  1. labels = dataset.pop('MPG') #从数据集中取出目标值MPG
  2. #数据标准化
  3. from sklearn.preprocessing import StandardScaler
  4. def norm(x):
  5. return (x - train_stats['mean']) / train_stats['std'] #标准化公式
  6. scaler = StandardScaler()
  7. normed_dataset = scaler.fit_transform(dataset)
(7)划分数据集
X_train, X_test, Y_train, Y_test = train_test_split(normed_dataset, labels, test_size=0.2, random_state=0)

模型构建

(8)模型定义
  1. import tensorflow as tf
  2. model = tf.keras.Sequential([
  3. tf.keras.layers.Dense(64, activation='relu', input_shape=[X_train.shape[1]]),
  4. tf.keras.layers.Dense(64, activation='relu'),
  5. tf.keras.layers.Dense(1)
  6. ])
(9)模型编译
  1. model.compile(loss='mse', optimizer='adam', metrics=['mae', 'mse'])
  2. plt.show()
(10)输出模型参数
  1. # 输出模型参数
  2. print(model.summary())

模型训练

(11)训练
history = model.fit(X_train, Y_train, epochs=100, validation_split=0.2, verbose=1)
(12)获取训练历史数据中的各指标值
  1. mae = history.history['mae']
  2. val_mae = history.history['val_mae']
  3. mse = history.history['mse']
  4. val_mse = history.history['val_mse']
(13)绘制指标在训练过程中的变化图
  1. plt.figure(figsize=(12, 4))
  2. plt.subplot(1, 2, 1)
  3. plt.plot(mae, label='Training MAE')
  4. plt.plot(val_mae, label='Validation MAE')
  5. plt.title('Training and Validation MAE')
  6. plt.legend()
  7. plt.subplot(1, 2, 2)
  8. plt.plot(mse, label='Training MSE')
  9. plt.plot(val_mse, label='Validation MSE')
  10. plt.title('Training and Validation MSE')
  11. plt.legend()
  12. plt.show()

(14)模型评估

使用测试集对模型进行评估

model.evaluate(X_test, Y_test, verbose=1)

4. 多层神经网络回归

(1)数据获取与预处理

IMDB数据集,有5万条来自网络电影数据库的评论,其中25000千条用来训练,25000用来测试,每个部分正负评论各占50%。和MNIST数据集类似,IMDB数据集也集成在Keras中,同时经过了预处理:电影评论转换成了一系列数字,每个数字代表字典中的一个单词(表示该单词出现频率的排名)

(2)读取数据
  1. from tensorflow.keras.datasets import imdb
  2. from tensorflow.keras.preprocessing.sequence import pad_sequences
  3. from tensorflow.keras.models import Sequential
  4. from tensorflow.keras.layers import Embedding, LSTM, Dense
  5. from tensorflow.keras.callbacks import EarlyStopping
  6. import tensorflow as tf
  7. # 加载数据,评论文本已转换为整数,其中每个整数表示字典中的特定单词
  8. (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=10000)
(2)预处理
  1. # 循环神经网络输入长度固定
  2. # 这里应该注意,循环神经网络的输入是固定长度的,否则运行后会出错。
  3. # 由于电影评论的长度必须相同,pad_sequences 函数来标准化评论长度
  4. x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=100)
  5. x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test, maxlen=100)

模型搭建

(3)模型定义
  1. model = Sequential([
  2. #定义嵌入层
  3. Embedding(10000, # 词汇表大小中收录单词数量,也就是嵌入层矩阵的行数
  4. 128, # 每个单词的维度,也就是嵌入层矩阵的列数
  5. input_length=100),
  6. # 定义LSTM隐藏层
  7. LSTM(128, dropout=0.2, recurrent_dropout=0.2),
  8. # 模型输出层
  9. Dense(1, activation='sigmoid')
  10. ])
(4)编译模型
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

模型训练

(5)训练
history = model.fit(x_train, y_train, epochs=5, validation_split=0.2, verbose=1)
(6)获取训练历史数据中的各指标值
  1. accuracy = history.history['accuracy']
  2. val_accuracy = history.history['val_accuracy']
  3. loss = history.history['loss']
  4. val_loss = history.history['val_loss']
(7)绘制指标在训练过程中的变化图
  1. # 绘制指标在训练过程中的变化图
  2. import matplotlib.pyplot as plt
  3. # plt.figure(1)
  4. plt.figure(figsize=(12, 4))
  5. plt.subplot(1, 2, 1)
  6. plt.plot(accuracy, label='Training Accuracy')
  7. plt.plot(val_accuracy, label='Validation Accuracy')
  8. plt.title('Training and Validation Accuracy')
  9. plt.legend()
  10. # plt.figure(2)
  11. plt.subplot(1, 2, 2)
  12. plt.plot(loss, label='Training Loss')
  13. plt.plot(val_loss, label='Validation Loss')
  14. plt.title('Training and Validation Loss')
  15. plt.legend()
  16. plt.show()

(8)模型评估

使用测试集对模型进行评估

  1. test_loss, test_acc = model.evaluate(x_test, y_test, verbose=1)
  2. print(f"Test Accuracy: {test_acc}, Test Loss: {test_loss}")

三、数据挖掘综合应用

1.微博评论情感分析

(1)数据读取

新浪微博数据集(网上搜集、作者不详)来源于网上的GitHub社区,有微博10 万多条,都带有情感标注,正负向评论约各 5 万条,用来做情感分析的数据集。

  1. import jieba
  2. import pandas as pd
  3. import re
  4. from wordcloud import WordCloud
  5. import matplotlib.pyplot as plt
  6. from keras.models import Sequential
  7. from keras.layers import Embedding, LSTM, Dense
  8. #from keras.preprocessing.text import Tokenizer
  9. from keras.utils import to_categorical
  10. from sklearn.model_selection import train_test_split
  11. from keras.callbacks import EarlyStopping
  12. data = pd.read_csv("E:/课程内容文件/大三下学期/数据挖掘与分析/课程实验/实验六/weibo_senti_100.csv")

数据预处理

(2)分词
data['data_cut'] = data['review'].apply(lambda x: jieba.lcut(x))
(3)去停用词
  1. with open("E:/课程内容文件/大三下学期/数据挖掘与分析-王思霖/课程实验/实验六/stopword.txt", 'r', encoding='utf-8') as f:
  2. stop = f.readlines()
  3. stop = [re.sub('\n', '', r) for r in stop]
  4. data['data_after'] = data['data_cut'].apply(lambda x: [i for i in x if i not in stop and i != '\ufeff'])
(4)词云分析
  1. num_words = [''.join(i) for i in data['data_after']]
  2. num_words = ''.join(num_words)
  3. num = pd.Series(jieba.lcut(num_words)).value_counts()
  4. wc_pic = WordCloud(background_color='white', font_path=r'C:\Windows\Fonts\simhei.ttf').fit_words(num)
  5. plt.figure(figsize=(10, 10))
  6. plt.imshow(wc_pic)
  7. plt.axis('off')
  8. plt.show()

(5)词向量
  1. # 构建词向量矩阵
  2. w = []
  3. for i in data['data_after']:
  4. w.extend(i)
  5. # 计算词频
  6. word_counts = pd.Series(w).value_counts()
  7. # 创建DataFrame
  8. num_data = pd.DataFrame(word_counts).reset_index()
  9. # 重命名列
  10. num_data.columns = ['word', 'count']
  11. # 添加id列
  12. num_data['id'] = num_data.index + 1
  13. # 创建单词到ID的映射字典
  14. word_to_id_dict = num_data.set_index('word')['id'].to_dict()
  15. # 优化的转化成数字函数
  16. def optimized_word2num(x):
  17. return [word_to_id_dict[i] for i in x if i in word_to_id_dict]
  18. # 应用优化后的函数
  19. data['vec'] = data['data_after'].apply(optimized_word2num)
(6)划分数据集
  1. import tensorflow as tf
  2. # from keras.preprocessing.text import Tokenizer
  3. from tensorflow.keras.preprocessing.sequence import pad_sequences
  4. maxlen = 128
  5. vec_data = pad_sequences(data['vec'], maxlen=maxlen)
  6. x_train, x_test, y_train, y_test = train_test_split(vec_data, data['label'], test_size=0.2, random_state=0)

模型搭建

(7)模型定义
  1. model = Sequential([
  2. Embedding(len(num_data) + 1, # 词汇表大小中收录单词数量,加1是因为要包括未知词
  3. 64, # 每个单词的维度
  4. input_length=maxlen),
  5. LSTM(64, dropout=0.2, recurrent_dropout=0.2),
  6. Dense(1, activation='sigmoid')
  7. ])
(8)编译模型
  1. model.compile(loss='binary_crossentropy',
  2. optimizer='adam',
  3. metrics=['accuracy'])

模型训练

(9)训练
  1. history = model.fit(x_train, y_train,
  2. epochs=5,
  3. validation_split=0.2,
  4. verbose=1)
(10)获取训练历史数据中的各指标值
  1. acc = history.history['accuracy']
  2. val_acc = history.history['val_accuracy']
  3. loss = history.history['loss']
  4. val_loss = history.history['val_loss']
(11)绘制指标在训练过程中的变化图
  1. # 绘制训练 & 验证的准确率
  2. plt.figure(figsize=(12, 4))
  3. plt.subplot(1, 2, 1)
  4. plt.plot(acc, label='Training Accuracy')
  5. plt.plot(val_acc, label='Validation Accuracy')
  6. plt.title('Training and Validation Accuracy')
  7. plt.legend()
  8. plt.subplot(1, 2, 2)
  9. # 绘制训练 & 验证的损失值
  10. plt.plot(loss, label='Training Loss')
  11. plt.plot(val_loss, label='Validation Loss')
  12. plt.title('Training and Validation Loss')
  13. plt.legend()
  14. plt.show()
(12)模型评估

使用测试集对模型进行评估

  1. score = model.evaluate(x_test, y_test, verbose=0)
  2. print('Test loss:', score[0])
  3. print('Test accuracy:', score[1])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/851562
推荐阅读
相关标签
  

闽ICP备14008679号