机器学习pytorch实践1
目录
- Pandas
- 基本数据结构
- CSV
- 方法
- 数据清洗
- Pytorch学习
- 两大法宝
- Python类
- self
- 常用的内置方法
- Tensor 张量
- TensorBoard 可视化
- Transform
- Normalize 归一化
- nn.Module
- 卷积神经网络
- 卷积层
- 池化层
- 泰坦尼克号预测
- 数据处理
- 创建模型
- 预测
Pandas
基本数据结构
- Series 一维
- DataFrame 二维
df [行] [列]
-
df [0] [‘name’]
-
df [df[‘name’]==‘LiHua’]
CSV
read_csv()
方法
head
头几条信息
info
信息
shape
尺寸
loc
可以使用标签查询
iloc
index查询
reviews.iloc[-5:]
#倒数五行的数据
isnull
any
all
drop
删除行或列,不会改变原始变量,如要改变原始原始变量,添加inplace=True参数
dropna
删除缺失值,不会改变原始变量
mean
平均值
map
函数
X_test['Sex'] = X_test['Sex'].map({'male': 0, 'female': 1})
astype
数据清洗
#手动定义一个person数据
df = pd.DataFrame(person)
df.loc[2, 'age'] = 30 # 修改数据 age列的第三行
- 读取和写入数据:
pd.read_csv()
: 从CSV文件中读取数据。pd.read_excel()
: 从Excel文件中读取数据。pd.read_sql()
: 从SQL数据库中读取数据。DataFrame.to_csv()
: 将数据写入CSV文件。DataFrame.to_excel()
: 将数据写入Excel文件。DataFrame.to_sql()
: 将数据写入SQL数据库。
- 数据处理:
DataFrame.head()
,DataFrame.tail()
: 显示DataFrame的前几行或后几行。DataFrame.info()
: 显示DataFrame的基本信息,包括每列的数据类型和非空值数量。DataFrame.describe()
: 提供DataFrame中数值列的统计摘要。DataFrame.shape
: 返回DataFrame的形状(行数,列数)。DataFrame.columns
: 返回DataFrame的列标签。DataFrame.index
: 返回DataFrame的行标签。DataFrame.drop()
: 删除行或列。DataFrame.rename()
: 重命名行或列。DataFrame.groupby()
: 根据指定的列对数据进行分组。DataFrame.merge()
: 合并两个DataFrame。DataFrame.concat()
: 沿指定轴连接两个或多个DataFrame。
- 数据选择和过滤:
DataFrame[column_name]
或DataFrame.column_name
: 选择单列数据。DataFrame[[column1, column2]]
: 选择多列数据。DataFrame.iloc[]
: 通过整数位置选择行和列。DataFrame.loc[]
: 通过标签选择行和列。DataFrame.query()
: 使用表达式选择数据。DataFrame.filter()
: 根据条件过滤数据。
- 数据操作:
DataFrame.apply()
: 应用函数到DataFrame的行或列。DataFrame.applymap()
: 应用函数到DataFrame的每个元素。DataFrame.map()
: 将函数应用到Series的每个元素。DataFrame.sort_values()
: 按值排序。DataFrame.sort_index()
: 按索引排序。
- 缺失值处理:
DataFrame.dropna()
: 删除包含缺失值的行或列。DataFrame.fillna()
: 用指定值填充缺失值。DataFrame.interpolate()
: 对缺失值进行插值。
- 其他:
pd.concat()
: 沿指定轴连接两个或多个Series或DataFrame。pd.merge()
: 合并两个DataFrame。pd.pivot_table()
: 创建数据透视表。pd.cut()
,pd.qcut()
: 将连续变量离散化。pd.to_datetime()
: 将字符串转换为日期时间对象。
Pytorch学习
两大法宝
dir
方法,列出所有工具
help
方法,工具使用说明
Python类
self
类的方法第一个参数是self,指调用方法时将类的实例作为self参数传入
常用的内置方法
-
__init__
: 构造方法,用于初始化对象的状态,在创建对象时自动调用。 -
__call__
:当一个对象(实例)被当作函数一样被调用时触发。image = transform(image) # 此时就是调用transform实例的call方法,返回一个tensor类型class MyClass: def __call__(self, *args, **kwargs): # *args是一个元组代表接受位置参数,**kwargs是一个字典代表接受关键字参数print(f"Positional arguments: {args}") print(f"Keyword arguments: {kwargs}") obj = MyClass() obj(1, 2, 3, a=4, b=5) # 这会调用 __call__ 方法并打印参数
-
__del__
: 析构方法,在对象被销毁(删除)时调用。 -
__str__
: 返回对象的字符串表示,通常在使用print()
函数打印对象时被调用。 -
__repr__
: 返回对象的“官方”字符串表示,通常用于调试和日志记录。 -
__len__
: 返回对象的长度,通常在调用内置函数len()
时被调用。 -
__getitem__
和__setitem__
: 用于实现对象的索引访问和赋值操作,可以直接用obj[index]执行getitem/setitem方法当你创建一个类并定义了
__getitem__
方法时,这个类就变成了可索引的对象,你可以通过索引来访问它的元素 -
__contains__
: 用于检查对象是否包含某个值,通常在使用in
关键字时被调用。
Tensor 张量
将image格式转换为tensor数据类型
TensorBoard 可视化
torch.utils.tensorboard.SummaryWriter
在TensorBoard中可视化记录训练过程中的各种指标,如损失、准确度、权重等
- 切换pytorch环境
conda activate pytorch
- 开启tensorboard
tensorboard --logdir=.\logs
tensorborad会读取logs文件夹下生成的event事件,在6006端口显示
!使用tensorborad可以在代码中增加图片(比如writer.add_image("resize-512", img_resize,2)
),但是不能直接修改图片,这样做刷新后不会更新视图(解决:重新启动)
Transform
transforms.ToTensor()
transforms.Resize()
transforms.Normalize()
Normalize 归一化
-
mean 平均值
-
std 标准差
-
input 输入数据
i n p u t = i n p u t − m e a n / s t d input = input-mean/std input=input−mean/std
将数据局限在[-1,1]范围内
nn.Module
nn.Module是所有神经网络的继承类
def __init__(self):#继承父类初始化方法super().__init__()def forward(self,input):return ouput
卷积神经网络
卷积层
-
input输入
- in_channel 输入通道数
- out_channel 输出通道数(几个卷积核对应几个)
-
kernel卷积核
- 一般设为3,表示3x3的卷积核
-
stride 步长
-
*padding 边距
池化层
最大池化操作:选取最大的一个值
泰坦尼克号预测
输入csv文件,预测乘客是否存活,输出一个csv文件。
其实是一个二分类问题
数据处理
- 选取哪些特征,舍弃哪些特征
- 处理空值,错误值
# 数据预处理
data = data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'Embarked'],axis=1) # 删除不需要的列
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1}) # 将性别转换为0和1# 处理缺失值
data['Age'].fillna(data['Age'].mean(), inplace=True)
data['Fare'].fillna(data['Fare'].mean(), inplace=True)
data['Pclass'] = data['Pclass'].astype('category') # 将Pclass转换为类别类型
data = pd.get_dummies(data) # 对分类变量进行独热编码# 分割特征和标签
X = data.drop('Survived', axis=1)
y = data['Survived']
创建模型
预测
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler# 读取CSV文件
data = pd.read_csv('train.csv')# 数据预处理
data = data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'Embarked'],axis=1) # 删除不需要的列
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1}) # 将性别转换为0和1# 处理缺失值
data['Age'].fillna(data['Age'].mean(), inplace=True)
data['Fare'].fillna(data['Fare'].mean(), inplace=True)
data['Pclass'] = data['Pclass'].astype('category') # 将Pclass转换为类别类型
data = pd.get_dummies(data) # 对分类变量进行独热编码# 分割特征和标签
X = data.drop('Survived', axis=1)
y = data['Survived']# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.95, random_state=42)# 将数据转换为PyTorch张量
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32).view(-1, 1)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test.values, dtype=torch.float32).view(-1, 1)# 定义神经网络模型
class TitanicModel(nn.Module):def __init__(self, input_size):super(TitanicModel, self).__init__()self.fc1 = nn.Linear(input_size, 64)self.fc2 = nn.Linear(64, 32)self.fc3 = nn.Linear(32, 1)self.sigmoid = nn.Sigmoid()def forward(self, x):x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))x = self.sigmoid(self.fc3(x))return x# 实例化模型
input_size = X_train.shape[1]
model = TitanicModel(input_size)# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
epochs = 100
for epoch in range(epochs):optimizer.zero_grad()outputs = model(X_train_tensor)loss = criterion(outputs, y_train_tensor)loss.backward()optimizer.step()if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}')# 在测试集上评估模型
with torch.no_grad():outputs = model(X_test_tensor)predicted = (outputs >= 0.5).float()accuracy = (predicted == y_test_tensor).sum().item() / len(y_test_tensor)print(f'Accuracy on test set: {accuracy:.2f}')# /* ******************************* */
# 加载测试数据
test_data = pd.read_csv('test.csv')
# print(test_data.isnull().any(axis=0))
X_test = test_data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'Embarked'], axis=1) # 删除不需要的列
X_test['Sex'] = X_test['Sex'].map({'male': 0, 'female': 1}) # 将性别转换为0和1# 处理缺失值
X_test['Age'].fillna(X_test['Age'].mean(), inplace=True)
X_test['Fare'].fillna(X_test['Fare'].mean(), inplace=True)
X_test['Pclass'] = X_test['Pclass'].astype('category') # 将Pclass转换为类别类型
X_test = pd.get_dummies(X_test) # 对分类变量进行独热编码print(X_test.head(5))
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_test)X_test_tensor = torch.tensor(X_scaled, dtype=torch.float32)
# 输出结果到CSV文件
with torch.no_grad():model.eval() # 设置模型为评估模式outputs = model(X_test_tensor)predictions = (outputs >= 0.5).int().numpy().flatten()results = pd.DataFrame({'PassengerId': test_data['PassengerId'], 'Survived': predictions})results.to_csv('results.csv', index=False)