os.path.join(path, *paths)函数:
功能:
拼接路径,返回值是所有成员的拼接,可以同时传入多个参数
例:
print(os.path.join('..','data0'))
print(os.path.join('..','data0','gagaga'))
#########输出为############
# ..\data0
# ..\data0\gagaga
os.makedirs(path, mode, exist_ok)函数:
功能:
在path(路径)下创建文件夹
参数:
path:
需要递归创建的目录,可以是相对或者绝对路径
mode:
可选参数,用于设置新目录的权限。默认值为0o777,表示最大权限。
exist_ok:
可选参数,如果设置为True,则即使目录已经存在也不会引发错误。默认值为False。当为默认值时如果目标目录已存在将引发 FileExistsError
例:
path = os.path.join('..','data0')
# os.path.join(path,*paths)函数返回值是文件名
os.makedirs(path)
pandas.get_dummies(data, columns,dummy_na)函数:基于one-hot编码的特征提取
功能:
将离散型特征每一种取值看作一种状态,将不同值的变量转换为0/1
参数:
data:
输入的数据(dataframe,series,array-like)
columns:
指定所需要实现类别转换的列名
dummy_na:
增加一列表示NaN值,默认值为false
例:
x = pd.DataFrame([['banana', 'monkey'], ['bone', 'dog'], ['bamboo', 'panda']], columns=['food', 'animal'])
print(x)
print(pd.get_dummies(x))
##########输出为#################
# food animal
# 0 banana monkey
# 1 bone dog
# 2 bamboo panda
# food_bamboo food_banana food_bone animal_dog animal_monkey animal_panda
# 0 0 1 0 0 1 0
# 1 0 0 1 1 0 0
# 2 1 0 0 0 0 1
离散性特征与连续性特征
离散性特征:
指在数据集中具有有限个取值的特征。这些特征通常表示为分类或离散的变量,而不是连续变量。
定性离散特征:
也称为名义型特征,表示某个事物的类别或属性。它们没有固定的顺序或数值关系。例如,性别(男/女)、颜色(红/绿/蓝)
定量离散特征:
也称为有序型特征,表示某个事物的按一定顺序排列的类别或属性。它们具有特定的数值关系,但与连续变量不同,定量离散特征之间的取值之间没有无限可能的连续性。例如,教育程度(小学/初中/高中/大学)
连续性特征:
连续性特征(例如年龄、身高、温度等)
内置函数fillna(value):
功能:
用于填充value到数据中。
参数:
value:
缺失值(NaN)或指定值
用法示例:
1.填充缺失值为指定值:
df.fillna(value)
2.填充缺失值为前一个非缺失值:
df.fillna(method='ffill')
3.填充缺失值为后一个非缺失值:
df.fillna(method='bfill')
4.在指定的列中填充缺失值:
df['column_name'].fillna(value)
5.在指定的列中填充缺失值为前一个非缺失值:
df['column_name'].fillna(method='ffill')
6.在指定的列中填充缺失值为后一个非缺失值:
df['column_name'].fillna(method='bfill')
注意:默认情况下,fillna函数会按列进行填充,即从第一列开始,然后从上到下依次填充缺失值。
数据预处理
创建数据集:
创建一个人工数据集并存储到指定目录下的CSV文件。
CSV文件:
每一行为一个数据每一个列为一个特征,逗号分隔值
os.makedirs(os.path.join('..','data'),exist_ok=True)
data_file = os.path.join('..','data','house_tiny.csv')
with open(data_file,'w') as f:
f.write('NumRooms,Alley,Price\n') # 三个特征(列)由逗号隔开:房屋数量,巷子类型,房屋价格
f.write('NA,Pave,127500\n') # 写入,每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n') # 创建的人工数据集有四行三列
with…as…语句:
作用:
简化资源管理,提供了一种确保资源在使用后被正确释放的方法,即使在出现异常的情况下也能够正常工作
底层原理:
with 语句实现原理建立在上下文管理器之上。
上下文管理器:
一个实现__enter__和__exit__方法的类,使用with语句确保在嵌套块的末尾调用__exit__方法把文件关闭防止执行异常而占用资源。
with open('./test_runoob.txt', 'w') as file:
file.write('hello world !')
# 以上实例将 hello world! 写到 ./test_runoob.txt 文件上。
# 执行顺序:
# 首先调用 __enter__ 方法,然后执行 with 语句中的代码,最后调用 __exit__ 方法。 即使出现错误,也会调用 __exit__ 方法,也就是会关闭文件流。
工作流程:
1. with语句后面的对象,它的方法__enter__会被自动调用
2. __enter__方法返回的对象会赋值给as后面定义的变量temp
3. with as代码体中的语句开始全部执行
4.代码体中的代码全部执行结束后,with语句后面的对象另一个特殊方法__exit__会被自动调用
使用方式:
1.打开文件并读取内容:
with open('file.txt', 'r') as f:
content = f.read()
# 在with语句块内对文件进行操作
# 文件会在with语句块结束后自动关闭
2.写入内容到文件:
with open('file.txt', 'w') as f:
f.write('Hello, world!')
# 在with语句块内对文件进行操作
# 文件会在with语句块结束后自动关闭
读取数据集:
使用pandas从创建的人工数据集目录中读取文件
import pandas as pd
data = pd.read_csv(data_file)# pd.read_csv()函数的返回值是一个字符串
print(data)
#########输出为##############
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
缺失值【NAN,(Not a Number)】处理:
处理缺失值的方式:
1. 插值法
2. 删除法:删除行直接忽略缺失值
插值法的例子:
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
#把人工数据集分为两组数据,前两列和所有行分为inputs(ID列不考虑在内),最后一列分为outputs
# iloc方法是根据行号和列号来获取DataFrame中的数据的方法,但这个方法使用时无需添加括号。
inputs = inputs.fillna(inputs.mean())
#我们使用平均函数mean()返回值来填充缺失项(对一列中的所有已知数据求和取平均)
print(inputs)
################输出为############
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
数据格式转换:
为了将数据集转换成张量方便训练,使用one-hot编码来赋值(利用pandas.get_dummies(data, columns)函数).
inputs = pd.get_dummies(inputs, dummy_na=True)# 特征提取
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
print(X,y)
##############输出为##############
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
One-Hot编码
功能:
将离散的分类变量转换为二进制向量表示的一种常用编码方式。在 One-Hot 编码中,对于每个不同的类别取值,都会创建一个对应的维度,并且只有一个维度的值为 1(代表归属于该类别),其他维度的值为 0。
例:
在上图中,读码时要每一列从上到下读取,如狗的One-Hot编码:[1, 0, 0]
好处:通过One-Hot编码可以将原始的分类变量转换为多个维度的二进制向量,便于机器学习算法对分类变量进行处理和分析。