预测房价是一个离散值,所以采用回归的方法。
数据读取
采用 pandas.read_csv() 方法读取文件。
然后再采用pandas_profiling模块对数据进行分析(探索性数据分析Exploratory Data Analysis,简称EDA)
pearson皮尔逊系数(单变量),spearman(多变量)
import pandas as pd
import pandas_profiling as ppf
train = pd.read_csv("train.csv") #数据读取进来
train.head
test = pd.read_csv("test.csv")
test.head
ppf.ProfileReport(train)
ppf.ProfileReport(test)
注pandas的两种数据结构是series和dataframe
pandas的可视化函数是 pandas.plotting.andrew_curves/bootstrap_plot/lag_plot/radviz/scatter_matrix
数据清洗
再进行数据清洗,删除重复信息,纠正存在的错误,并提供数据一致性(字符化为数字)。
难点:难以归纳统一的方法
数据清洗方法
1、解决缺失值:最大最小平均或者更为复杂的概率估计去替代缺失的值
注意不能随意删除,会导致特征丢失。
miss = full.isnull().sum() #统计出空值的个数
miss[miss>0].sort_values(ascending=True) #由低到高统计数据
#字符类型
for col in cols1:
full[col].fillna("None",inplace=True)
#数值类型
for col in cols:
full[col].fillna(0, inplace=True)
#平均值填充
full["LotFrontage"].fillna(np.mean(full["LotFrontage"]),inplace=True)
#众数填充
for col in cols2:
full[col].fillna(full[col].mode()[0], inplace=True)
2、去重:相等的记录合并为一条记录(即合并或者清除)
3、解决错误值:用统计分析的方法识别出可能的错误值或异常值。如偏差分析、是被不遵守分布或回归方程的值,也可以采用简单规则库(常识性规则,业务特定规则)等等
利用箱型图发现异常点
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10,8))
sns.boxplot(train.YearBuilt, train.SalePrice) ##箱型图是看异常值的,离群点
利用线形图删除异常点
plt.figure(figsize=(12,6))
plt.scatter(x=train.GrLivArea, y=train.SalePrice) ##散点图可以用来观察存在线型的关系
plt.xlabel("GrLivArea", fontsize=13)
plt.ylabel("SalePrice", fontsize=13)
plt.ylim(0,800000)
train.drop(train[(train["GrLivArea"]>4000)&(train["SalePrice"]<300000)].index,inplace=True)#pandas 里面的条件索引 删除大于4000和小于300000的散点
# inplace = True:不创建新的对象,直接对原始对象进行修改 inplace = False:对数据进行修改,创建并返回新的对象承载其修改结果。
4、解决数据的不一致性:不如数据是类别性(label/onehot)或者次序型(第一第二第三不能放到模型中去用label)
数据清洗的八大场景
1、删除多列 采用pandas中的drop
2、更改数据类型
3、将分类变量转换为数字变量
4、检查缺失的数据
5、删除列中的字符串
6、删除列中的空格 利用dropna
7、用字符串连接两列(带条件) 数据的乘除之类的
8、转换时间戳(从字符串到日期时间格式)
数据处理
让数据更好的能够拟合好我们的模型,更便于计算,减少计算量,但是具体问题要具体分析。
方法:
1、对数变换
2、标准缩放
3、转换数据类型
4、独热编码
full2 = pd.get_dummies(full)##独热编码
5、标签编码
from sklearn.preprocessing import LabelEncoder
lab = LabelEncoder()
full["Alley"] = lab.fit_transform(full.Alley)
full["PoolQC"] = lab.fit_transform(full.PoolQC)
full["MiscFeature"] = lab.fit_transform(full.MiscFeature)
full["Fence"] = lab.fit_transform(full.Fence)
full["FireplaceQu"] = lab.fit_transform(full.FireplaceQu)
full["GarageQual"] = lab.fit_transform(full.GarageQual)
full["GarageCond"] = lab.fit_transform(full.GarageCond)
full["GarageFinish"] = lab.fit_transform(full.GarageFinish)
特征工程 sklearn
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
特征工程:最大限度从原始数据中提取特征以供算法和模型使用。
特征工程主要分为三部分(以及对应的sklearn包):
1、数据预处理 sklearn-Processing data
不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”, 那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
定性特征不能直接使用:通常使用哑编码的方式将定性特征转换为定量特征,假设有N种定性值,则将这一个特 征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的 方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效 果。(哑编码也就是独热编码)
存在缺失值:填充缺失值。
信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的数据变换,都能达到非线性的效果。
2、特征选择 sklearn-Feature selection
3、降维 sklearn-Dimensionality reduction