后续学习到新的知识将继续更新
文章目录
1 数据查看
1.1 数据信息
- df.head() 查验前5条数据,df.tail() 查验后五条数据
- df.info() 查验DataFrame的信息,如数据总条数,各属性数目及数据类型
- df[‘ColumnName’].value_counts() 查看各种类型数据的出现频数
- df.shape 查看数据维度
1.2 数据可视化
- 主要是使用功能强大且使用方便的seaborn库来进行绘图。
- 折线图:如
sns.lineplot(data=line_data, label='data1')
- 柱状图:如
sns.barplot(x=data.index, y=data['label'])
- 热力图:如
sns.heatmap(data=flight_data, annot=True)
,annot=True
设置在每格内显示数值 - 散点图:如
sns.scatterplot(x=data['x'], y=data['y'], hue=data['label'])
,hue属性是调节点的颜色。还可以通过sns.regplot(x=data['x'], y=data['y'])
来绘制一条拟合数据最好的回归线,观察数据走势。 - 统计直方图:如
sns.histplot(data['x'])
,统计该列所有可能值的出现次数。
- 折线图:如
2 数据清洗
2.1 介绍
- 查看并统计含缺失值的列:
missing_values = data.isnull().sum()
- 遇到缺失值,应该弄清其是何种原因导致的。如果是本身就不存在的值,则不必考虑应填充什么;而如果是未被记录的值,则需要进行填补(imputation),这需要查看已有的数据分布,并具备一定的领域知识。
- 删除包含缺失值的行:
data.dropna()或data.dropna(axis=1)
,但是一般不建议这么做。
2.2 填补缺失值
-
自动填充:
data.fillna(value)
,value
可以是0或者某种类别。还可以设置填充方式:data.fillna(method='ffill/bfill')
,ffill
是使用该空值以前最后一个有效的数据来填补,bfill
是使用该空值的下一个数据来进行填补。 -
类别型数据可以填补出现频率最高的特征值,数值型数据可以填充平均值或中位数。
X_train['ColumnName'].fillna(X_train['ColumnName'].mean(), inplace=True)
3 特征工程
3.1 作用
- 提高模型性能,减少计算代价,增加模型的可解释性。
3.2 数据预处理
- 标准化:是指将数据按比例缩放到零均值和单位方差的过程。对线性模型和神经网络比较有效。
公式:(x-μ)/σ
代码:from sklearn import preprocessing
中的preprocessiong.scale(X)
- 规范化:将单个样本缩放到一个单位范数的过程,可以用不同的方式定义范数(L1,L2)。
公式:对每个样本除以该样本的对应范数值。
代码:from sklearn import preprocessing
中的preprocessiong.normalize(X, norm='l1')
- 归一化:将数据缩放到0-1区间内,也可以指定其他范围。
公式:(x-min(x)) / (max(x) - min(x))
代码:from sklearn import preprocessing min_max_scaler = preprocessiong.MinMaxScaler() data = min_max_scaler.fit_transform(X)
- 数值型变换:如对特征值进行指数/对数运算
- 计数:如果样本中含有许多二值特征,则可以通过计数,特征值为1则加1,为0则不加,来判断该样本同时满足了几个特征。
3.3 特征处理
-
特征抽取-特征向量化:将一些计算机无法读懂的数据转换成结构化,可学习的数据
from sklearn.feature_extraction import DictVectorizer dict_vec = DictVectorizer(sparse=False) # sparse=False表示返回一个one-hot矩阵,否则返回稀疏矩阵 X_train = dict_vec.fit_transform(X_train.to_dict(orient='record'))
-
特征二值化:类似于分箱,即设置阈值,对数据进行阈值处理。
代码:binarizer = preprocessing.Binarizer(threshold=0.5) data = binarizer.transform(X)
-
特征筛选:良好的数据组合不需要太多,冗余的特征不仅对模型的性能提升较小,还会使得多出许多无用的计算。
- L1正则化可以通过训练,使得部分参数值拥有较大值,而其余为0或接近于0,以达到特征选择的目的。
- 随机森林也能进行特征选择,因为每棵树每次递归时会选择最优特征,且有部分特征被抛弃,那么将所有树视为整体,选中次数最多的特征即较为重要的特征。
-
构造新特征:这通常需要具备一些领域知识,并且十分耗时。
- 有时候特征间的比例比各自的绝对量更能预测出结果,如根据食品配料表预测食品特性,或者根据工程材料表预测成品的属性等等,这时就可以构造出一些比例特征。
- 还有,在股票价格预测时,投资者在做出决策前,通常需要查看过去一段时间内的数据,而不仅仅是前一天的价格,因此可以通过计算过去一周,过去一个月,过去一年的平均收盘价,作为三个新特征(时间窗口可以具体调整)。在此基础上,我们还是可以通过计算三个特征间两两的比例,来引入价格变化趋势这一特征。对于交易量,可以进行与收盘价相类似的操作。投资者还会关系股票的波动情况,它描述了股票是否稳定及投资是否有风险。可以用收盘价或交易量的标准差来构造特征。
- 拆分与合并:一些文本数据,可以通过分隔符(如空格,下划线等)来分割成多个特征。或者根据某个属性进行聚合之后再求和/平均/频率等等(借助groupby函数),如求某个国家的平均收入。
-
发掘关系
- 相似性度量:即综合评定两个事物之间相近程度的一种度量。两个事物越接近,它们的相似性度量也就越大,而两个事物越疏远,它们的相似性度量也就越小。常用的相似性度是有:相关系数(衡量变量之间接近程度),相似系数(衡量样品之间接近程度),若样品给出的是定性数据,这时衡量样品之间接近程度,可用样本的匹配系数、一致度等。
- 互信息:两个量之间的互信息是衡量一个量的知识减少另一个量的不确定性的程度。它可以找到特征与目标间的包括线性在内各种关系。互信息的最小值为0.0,表示两个量相互独立,它理论上没有上限,但是高于2.0的值也很少。互信息值低的特征也不是完全没用,或许根据领域知识,该特征可以和其他特征组合起来成为新的属性,互信息计算代码如下:
from sklearn.feature_selection import mutual_info_regression def make_mi_scores(X, y, discrete_features): mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features) mi_scores = pd.Series(mi_scores, name="MI Scores", index=X.columns) mi_scores = mi_scores.sort_values(ascending=False) return mi_scores
4 模型提升
4.1 正则化
-
如果模型过于复杂,则会造成过拟合,模型泛化能力下降。可以通过先验,来设置L1或L2正则化来控制训练过程中参数的变化方向,避免参数过拟合。
# 如线性模型中的Lasso模型和Ridge模型 from sklearn.linear_model import Lasso from sklearn.linear_model import Ridge
4.2 模型检验,交叉验证
- 就是让除测试集外的数据中的子集都能成为一次验证集,来评估模型,并根据所有划分的结果,取平均来调节超参数,得到一种较优的超参组合。通常有k折交叉验证,留一交叉验证等方案。
# 网格搜索 from sklearn.model_selection import GridSearchCV # 设置好模型,参数,几折验证 gs = GridSearchCV(model, params, cv=k, n_jobs=-1, verbose=1) gs.fit(X_train, y_train)
5 数据类型
5.1 图片数据
- 一些图像处理的操作可以看我之前的 -> 整理笔记。
- 不同的颜色空间:
BGR,RGB,HSV,HLS,如通过cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
进行变换。
5.2 文本数据
- 处理句子最简单的一种方法就是分词,然后统计每个句子中出现单词的次数,形成一个稀疏矩阵。通过
from sklearn.feature_extraction.text import CountVectorizer
实现。 - 然而有些词,在所有句子中都经常出现,如the,a等,这类词对分析没有什么帮助,如果使用
CountVectorizer
则可能过于关注这类词,这时可以改为TfidfVectorizer
,即词频-逆文本频率,考虑了词在整个数据集中出现的频率。