使用iris数据集SVC分类
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.metrics import accuracy_score
# 加载示例数据集
# 这里使用Iris数据集,您可以根据需要替换为其他数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 假设只提供部分标签的数据
# 将标签设置为-1表示未知标签
y_unlabeled = y.copy()
y_unlabeled[30:100] = -1 # 假设数据集的30到100个样本标签缺失
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_unlabeled, test_size=0.3, random_state=42)
# 使用支持向量机 (SVC) 创建一个自训练分类器
base_svc = SVC(kernel='linear', probability=True)
self_training_model = SelfTrainingClassifier(base_svc)
# 训练自训练分类器
self_training_model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = self_training_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")
使用LSTM对于序列数据进行预测
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential #Sequential 用于初始化神经网络
from keras.layers import Dense #Dense 用于添加全连接的神经网络层
from keras.layers import LSTM #LSTM 用于添加长短期内存层
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 生成正弦波时间序列
t = np.linspace(0, 18.9, 300)
sin_x=np.sin(t)
x = sin_x + np.random.normal(0, 0.1, t.shape) # 添加噪声
# 可视化时间序列
plt.plot(t, sin_x, label='原始正弦波时间序列', color='deepskyblue', linestyle='--')
plt.plot(t, x, label='添加噪声的正弦波时间序列', color='black')
plt.title('添加噪声前后的正弦波时间序列', fontsize=14)
plt.xlabel('时间', fontsize=12)
plt.ylabel('值', fontsize=12)
plt.legend(fontsize=12,loc="center left")
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
x_train=x[0:200]
x_test=x[200:300]
# # 将时间序列数据转换为监督学习格式
# # 使用过去10个时间步长的数据来预测下一个值
look_back = 10
x_train_data = []
y_train_data = []
for i in range(len(x_train) - look_back):
x_train_data.append(x_train[i:i + look_back])
y_train_data.append(x_train[i + look_back])
x_train_data = np.array(x_train_data)
y_train_data = np.array(y_train_data)
# 将数据形状调整为LSTM期望的格式:(样本数, 时间步长, 特征数)
x_train_data = x_train_data.reshape((x_train_data.shape[0], x_train_data.shape[1], 1))
x_test_data = []
y_test_data = []
for i in range(len(x_test) - look_back):
x_test_data.append(x_test[i:i + look_back])
y_test_data.append(x_test[i + look_back])
x_test_data = np.array(x_test_data)
y_test_data = np.array(y_test_data)
# 将数据形状调整为LSTM期望的格式:(样本数, 时间步长, 特征数)
x_test_data = x_test_data.reshape((x_test_data.shape[0], x_test_data.shape[1], 1))
# 构建LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(look_back, 1))) # 第一层LSTM,返回序列
model.add(LSTM(units=50)) # 第二层LSTM,不返回序列
model.add(Dense(1)) # 全连接层,用于预测
# 编译模型
model.compile(optimizer='adam', loss='mse')
# 打印模型摘要
model.summary()
# 训练模型
history = model.fit(x_train_data, y_train_data, epochs=50, batch_size=32, validation_split=0.2)
# 评估模型性能(使用训练集上的损失作为示例,实际应用中应使用独立的测试集)
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.plot(loss, label='训练损失', color='blue')
plt.plot(val_loss, label='验证损失', color='red',linestyle='--')
plt.title('损失对比', fontsize=14) # 标题字体大小
plt.xlabel('轮次', fontsize=12)
plt.ylabel('损失', fontsize=12)
plt.legend(fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
# 进行预测(使用训练集的一部分样本作为示例)
num_predictions=100
predictions = model.predict(x_test_data[:num_predictions])
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test_data[:num_predictions], predictions)
print("mse=",mse)
# 将预测结果与实际值进行对比
plt.figure(figsize=(6, 4))
plt.plot(t[200+look_back:200+look_back+len(predictions)], y_test_data[:num_predictions], label='实际值', color='blue')
plt.plot(t[200+look_back:200+look_back+len(predictions)], predictions, label='预测值', color='red', linestyle='--')
plt.title('实际值与预测值对比', fontsize=14) # 标题字体大小
plt.xlabel('时间', fontsize=12)
plt.ylabel('值', fontsize=12)
plt.legend(fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()