使用sklearn前进行数据整理
一、安装所需要的包
pip install numpy
pip install matplotlib
…
或者用condos安装
二、导入所需要的库
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
——按照需要导入库
三、导入数据集
sklearn库里的数据——此数据暂时不需要进行额外处理
举例:
frome sklearn.datasets import load_wine
wine = load_wine
wine.data.shape #查看wine特征的结构
wine.data.info() #查看wine数据的各列的情况
wine.target #查看wine数据的标签
外部数据——转化为DataFrame结构
读文件,我的文件时csv格式的,其它文件读改一下后缀或者百度一下
path = r"movies_metadata.csv" #加上r就不需要加转义字符
df = pd.read_csv(path, engine='python'
,index_col = 0 #如果不设置此参数,默认第一列也为特征;设置后,第一列会设为索引
)
四、对数据进行预处理
1.一行一列进行处理
最先开始,我是对DataFrame里的数据一个个进行处理,先读行,再读行里的每一列,循环读到最后一行,DataFrame里的数据是字符串,相当于对字符串进行处理。部分代码如下:
globals1 = {
'nan': 0
}
globals2 = {
'FALSE': 0
} #用来解决eval()类型转换的问题
# 读表格内容为列表,列表里为字典的值,返回keyValue的种类
def readData(path):
resultList = []
for j in range(0, len(df)): #遍历每一行
df2 = df.iloc[j,] #遍历每一列
belongs = str(df2['belongs_to_collection']) #获取列名为belongs_to_collection的单元格
belongs_id = eval(belongs, globals1,globals2) #将belongs转换为字典或列表
if type(belongs_id) != int and type(belongs_id) != float and type(belongs_id) != str:
belongs_to_collection = belongs_id['id']
if is_number(belongs_to_collection):
belongs_to_collection_id = belongs_id['id']
else:
belongs_to_collection_id = 0
else:
belongs_to_collection_id = 0
return resultList #返回一个DataFrame
上面读取数据就是对数据进行处理,特别繁琐,后来学习别人的代码,明细简单了很多。
如下:
2.删除缺失值过多和观察判断来说和预测的y没有关系的列
import pandas as pd
data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 1 DT\data\data.csv",index_col
= 0)
data.head() #显示dataframe前5行
data.info() #显示dataframe各列的缺失值情况等信息
data.drop(["Cabin","Name","Ticket"],inplace=True,axis=1) #处理缺失值,对缺失值较多的列进行填补,有一些特征只确实一两个值,可以采取直接删除记录的方法
#inplace=True表示替代原数据;axis=1表示列操作,axis=0表示行操作
data["Age"] = data["Age"].fillna(data["Age"].mean())#选择列名为Age的列,并用平均值填充空缺值
data = data.dropna()#删除为空值的行数据
3.将分类变量转换为数值型变量
#将二分类变量转换为数值型变量
#astype能够将一个pandas对象转换为某种类型,和apply(int(x))不同,astype可以将文本类转换为数字,用这
#个方式可以很便捷地将二分类特征转换为0~1
data["Sex"] = (data["Sex"]== "male").astype("int")
#将三分类变量转换为数值型变量
labels = data["Embarked"].unique().tolist()#将列名为“Embarked”的列里的所有不同的值罗列出来,返回一个list
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))#lambda为匿名函数,返回Embarked值所在list里索引
data.head()#查看处理后的数据集
五、提取标签和特征矩阵,分离测试集和训练集
import pandas as pd
data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 1 DT\data\data.csv",index_col= 0)
x = data.iloc[:,data.columns != "Survived"] #X为列名不为"Survived"的dataframe
y = data.iloc[:,data.columns == "Survived"] #X为列名为"Survived"的dataframe
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(x,y,test_size=0.3) #划分测试集和训练集
for i in [Xtrain, Xtest, Ytrain, Ytest]: #修正测试集和训练集的索引
i.index = range(i.shape[0])
Xtrain.head() #查看分好的训练集和测试集
上面是参考别人的方法,直接用对dataframe操作就可以了。但是会报错,说y的标签不是一列。
y = np.array(y).astype("float")