目录
参考资料
1. 导入包
2. 导入数据
3. 查看前5行数据
4. 分类变量转化为哑变量(性别)
知识点——哑变量
5. 合并数据框
6. 删掉不必要的列
7. 统计每一行的缺失值
8. 可视化缺失值
9. 查看各列之间的相关性并可视化
10. 丢掉相关性很弱的列
11. 缺失值的填充
12. 删除和筛选最终建模的列
13. KNN建模
知识点——KNN
14. 预测
kaggle原文
哑变量
哑变量详解
回归模型中的哑变量是个啥?何时需要设置哑变量?
import numpy as np
# 矩阵计算
import pandas as pd
# 数据处理,比如读数据、删数据
import seaborn as sns
# 可视化模板
import matplotlib.pyplot as plt
# 可视化基本库
利用pd.read_csv()读入数据
# 导入数据
train = pd.read_csv('E:/【桌面】/titanic/train.csv')
test = pd.read_csv('E:/【桌面】/titanic/test.csv')
利用train.head()获取前5行数据,里面可以添加参数!
print(train.head())
# 获取数据前5行(默认)
# 里面可以添加参数:train.head(6)获取前6行
原本: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),也叫虚拟变量
目的:主要用于处理多分类变量,把不能量化的多分类变量量化,每个哑变量对模型的影响都细化,提高模型精准率
具体操作
哪些情况下要设置哑变量?
无序多分类变量
例如,“血型”分为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表示。此时可以转化为哑变量,使得分类变量对模型的影响足够充分。
把列转化为哑变量之后,拼接到数据框中
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)
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)
统计每一列数据的缺失值数量
print(train.isnull().sum())
print(test.isnull().sum())
利用sns可视化模板中的热力图,传入缺失值
plt.show()把图片可视化展现出来
sns.heatmap(train.isnull())
# 查看可视化图
plt.show()
train.corr() 获得各列之间的相关性
sns.heatmap()热力图,传入相关性,annot=True代表把相关性标在图上!
# 查看各元素之间的关系
print(train.corr())
# 可视化
sns.heatmap(train.corr(), annot=True)
# 查看可视化图
plt.show()
# 丢掉相关性很低很弱的列
train = train.drop(['Cabin', 'Parch', 'SibSp'], axis=1)
# Test Data
test = test.drop(['Cabin', 'Parch', 'SibSp'], axis=1)
# 训练集
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)
# 删掉年龄列
# 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[]前面控制行,后面控制列
# 通过名字来定位所对应的行或列
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基础思想
分类
要判断一个数据是A还是B,主要看它的邻居都是谁
如果附近的A更多,则认为它是A;反之,为B
K指邻居的数量,非常重要;如果太小,会收到个例影响;如果太大,则会受到远处的异常值影响;需要反复尝试
计算距离时,可以用欧式,也可以用曼哈顿
缺点
需要计算所有的距离,从高到低排列;因此,数据量越大,效率越低。
生成预测列
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 指不写行名称