目录
参考资料
1. 导入包
import numpy as np
# 矩阵计算
import pandas as pd
# 数据处理,比如读数据、删数据
import seaborn as sns
# 可视化模板
import matplotlib.pyplot as plt
# 可视化基本库
2. 导入数据
-
利用pd.read_csv()读入数据
# 导入数据
train = pd.read_csv('E:/【桌面】/titanic/train.csv')
test = pd.read_csv('E:/【桌面】/titanic/test.csv')
3. 查看前5行数据
-
利用train.head()获取前5行数据,里面可以添加参数!
print(train.head())
# 获取数据前5行(默认)
# 里面可以添加参数:train.head(6)获取前6行
4. 分类变量转化为哑变量(性别)
-
原本:sex——0代表female,1代表male
-
哑变量:分成两列,一列为female,一列为male,均为1代表是,0代表否
-
函数:pd.get_dummies(),传入数据框的列
# 将性别列变成哑变量
train_sex = pd.get_dummies(train['Sex'])
# 把train数据集的Sex列变成哑变量
# 原本是:Sex 0代表男,1代表女
# 哑变量:变成两列,一列是male,一列是female,为1则是,为0则否
知识点——哑变量
-
定义:哑变量(DummyVariable),也叫虚拟变量
-
目的:主要用于处理多分类变量,把不能量化的多分类变量量化,每个哑变量对模型的影响都细化,提高模型精准率
-
具体操作
-
假如“职业因素”列,共有5个分类变量:学生、农民、工人、公务员、其他。转化为4列0、1变量,从而提高模型精度。
哪些情况下要设置哑变量?
-
无序多分类变量
-
例如,“血型”分为A、B、O、AB四个类型,如果直接赋值为1、2、3、4,它在数学上是有从小到大的顺序关系的,而且还是等距的。这样和现实情况不符,需要转化为哑变量。
-
-
有序多分类变量
-
例如,疾病的严重程度,分为轻、中、重度,如果赋值为1、2、3(等距)或者1、2、4(等比),这样虽然可以体现等级关系,但与现实不符。此时可以转化为哑变量。
-
-
连续性变量
-
年龄很细,年龄增加一岁,对模型的影响很小,没有太大的实际意义。我们可以把连续变量离散化,以10岁作为一个年龄段划分,0~10、11~20、21~30等等,用1、2、3、4表示。此时可以转化为哑变量,使得分类变量对模型的影响足够充分。
-
-
5. 合并数据框
-
把列转化为哑变量之后,拼接到数据框中
-
pd.concat([x, y], axis=1)
-
x和y代表要合并的数据框
-
axis代表拼接方式,1代表按列拼起来
-
train = pd.concat([train, train_sex],axis=1)
# 把两个数据框合并起来,合并方式为按列合并
同样的操作不仅要预处理训练集,还要处理测试集!!!
# 同样的操作对测试集 test_sex = pd.get_dummies(test['Sex']) test = pd.concat([test, test_sex], axis=1)
6. 删掉不必要的列
-
train.drop(['sex', 'name'], axis=1)
-
前面传入要删掉的名称
-
axis=1代表按列删除
-
# 丢掉不必要的列
train = train.drop(['Name', 'Sex', 'Ticket', 'Embarked'], axis=1)
# 同理对测试集
test = test.drop(['Name', 'Sex', 'Ticket','Embarked'], axis=1)
7. 统计每一行的缺失值
-
统计每一列数据的缺失值数量
print(train.isnull().sum())
print(test.isnull().sum())
8. 可视化缺失值
-
利用sns可视化模板中的热力图,传入缺失值
-
plt.show()把图片可视化展现出来
sns.heatmap(train.isnull())
# 查看可视化图
plt.show()
9. 查看各列之间的相关性并可视化
-
train.corr() 获得各列之间的相关性
-
sns.heatmap()热力图,传入相关性,annot=True代表把相关性标在图上!
# 查看各元素之间的关系
print(train.corr())
# 可视化
sns.heatmap(train.corr(), annot=True)
# 查看可视化图
plt.show()
10. 丢掉相关性很弱的列
# 丢掉相关性很低很弱的列
train = train.drop(['Cabin', 'Parch', 'SibSp'], axis=1)
# Test Data
test = test.drop(['Cabin', 'Parch', 'SibSp'], axis=1)
11. 缺失值的填充
# 训练集
age_mean = train['Age'].mean() # 求出该列的均值
train['age_mean'] = train['Age'].fillna(age_mean).apply(np.ceil) # 为含缺失值的列填充进去
# 测试集
age_mean = test['Age'].mean()
# 获取该列的均值
test['age_mean'] = test['Age'].fillna(age_mean).apply(np.ceil)
# .fillna()指用均值来填充缺失值
# .apply()指应用到数据上一个函数, np.ceil指所有的数取刚刚大于它的值——例如,-1.7取-1
fare_mean = test['Fare'].mean()
test['Fare'] = test['Fare'].fillna(age_mean)
12. 删除和筛选最终建模的列
# 删掉年龄列
# Training Data
train = train.drop(['Age'], axis = 1)
train.head()
# Test Data
test_new = test.drop(['PassengerId', 'Age'], axis = 1)
# 筛选特定的列作为测试集和训练
X = train.loc[:, ['Pclass', 'Fare', 'female', 'male', 'age_mean']]
y = train.loc[:, ['Survived']]
# .loc[]前面控制行,后面控制列
# 通过名字来定位所对应的行或列
13. KNN建模
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
# 初始化KNN分类器,里面可以设置分类器默认的邻居数量、权重等
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_neighbors': np.arange(1, 100)
}
# 设置遍历的邻居数量N
knn_cv = GridSearchCV(knn, param_grid, cv=5)
# 获得最终的KNN分类器,param_grid则帮助确定,N从1到100,哪一个N的分类效果最好;
# cv表示交叉验证为5折交叉验证
print(knn_cv.fit(X, y.values.ravel()))
# .values 只获取数据框中的数据,列名删掉,得到的是一个n维数组
# .ravel() 返回一个扁平的一维数组
# [1,2,3],[4,5,6] 变成 [1,2,3,4,5,6]
print(knn_cv.best_params_)
# 返回分类效果最好的N的大小,邻居数量为多少时,效果最好?
print(knn_cv.best_score_)
# 分类效果得分
知识点——KNN
KNN基础思想
-
分类
-
要判断一个数据是A还是B,主要看它的邻居都是谁
-
如果附近的A更多,则认为它是A;反之,为B
-
K指邻居的数量,非常重要;如果太小,会收到个例影响;如果太大,则会受到远处的异常值影响;需要反复尝试
-
计算距离时,可以用欧式,也可以用曼哈顿
-
-
缺点
-
需要计算所有的距离,从高到低排列;因此,数据量越大,效率越低。
-
14. 预测
-
生成预测列
predictions = knn_cv.predict(test_new)
# 测试集带进去
# 提交结果
submission = pd.DataFrame({
'PassengerId': np.asarray(test.PassengerId),
'Survived': predictions.astype(int)
})
# np.asarray()把内部元素变成数组
# a = [1, 2]
# np.asarray(a)
# array([1, 2])
# .astype(int) 把pandas数据类型转化为指定的数据类型——int
# 输出为csv
submission.to_csv('my_submission.csv', index=False)
# index=False 指不写行名称