ML数据分析

编程入门 行业动态 更新时间:2024-10-23 20:30:20

ML<a href=https://www.elefans.com/category/jswz/34/1771445.html style=数据分析"/>

ML数据分析

对于一个ML问题,解决思路通常是:
拿到数据后怎么了解数据(可视化)
选择最贴切的机器学习算法
定位模型状态(过/欠拟合)以及解决方法
大量极的数据的特征分析与可视化
各种损失函数(loss function)的优缺点及如何选择

首先拿到数据要进行***数据分析***

数据准备->数据清洗->数据重构->数据分析
典型的重构就是归一化

可以利用降维算法来实现数据的处理,用更少的特征描述原始图像大部分信息
常用的例如:PCA,LDA
但是还是要通过对数据的理解来先处理一遍数据

1.拿到数据首先转换成.csv格式的,然后利用pandas读取,并且转换成DataFrame格式的数据(其他.txt格式的可以先变成dataframe格式的然后再dataframe.to_csv写成.csv文件)

首先要进行数据分析,
dataframe.info()数据的基本信息,在info中就可以了解是否有缺失数据了!
dataframe.describe()数据均值,方差啥的
然后要进行缺失数据分析了!
dataframe.isnull()下的很多方法

如果特征类别数目很少,那么可以考虑采用特征增加的方法:例如交叉特征/多项式特征
对于给定的特征x,我们可以考虑x,x2、x3等,可用preprocessing模块的PolynomialFeatures实现。同样采用wave数据集进行分析。

交叉特征

2。观察两个特征之间的关系,采用散点图表示pairplot,对于存在明显线性关系的特征可以绘制出来其回归直线lmplot
注意,对于类别型特征(最典型的就是字符串型特征)采用0,1,2。。替换
houseprice[‘MSZoning’]=houseprice[‘MSZoning’].map({‘RL’:1,‘RM’:2,‘RR’:3,}).astype(int)
按照类别个数可以画出柱状图

3。特征之间相关系数的求解,并且用heatmap进行绘制(特征之间相关性的强弱),用这种方法可以进行特征筛选(主要看特征和类别/目标y值之间的相关性)。并且可以绘制不同特征与分类/回归y值之间的关系,更加直观
核心是要找特征与结果之间的关系,因为我们最后是进行特征筛选,选择相关性大的特征
dataframe.Age[dataframe.Age.notnull()]

注意对于相关性系数[-1, 1],它主要是衡量两个变量之间的线性关系,数值在[-1.0, 1.0]区间中。数值越是接近0,两个变量越是线性不相关。但是数值为0,并不能说明两个变量不相关,只是线性不相关而已

并且!要会看heatmap

Feature和Label的相关度可以看作是该Feature的重要度,越接近1或-1就越好。
Feature和Feature之间的相关度要低,如果两个Feature的相关度很高,就有可能存在冗余。

除此之外,还可以训练模型来筛选特征,比如带L1或L2惩罚项的Linear Model、Random Forest、GDBT等,它们都可以输出特征的重要度。

4。对于重要的特征可以利用distplot看特征值的分布规律,对于取值为连续值的feature画分布密度distplot(可以多个密度画在一副图里面),特征取值为离散的feature画countplot

Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
中间的data_train.Survived == 0返回是True Flase形式的列,然后其他列按照True提取对应的值组成新的列

之后用get_dummies把类别特征变成one hot型编码特征

注:我们可以手动选择特征,也可以通过sklearn的feature selection来进行特征选择,但是在特征为高维度时非常耗时间
我们的分类器自己能否甄别那些特征是对最后的结果有益的???
采用正则化方法
l2正则化,它对于最后的特征权重的影响是,尽量打散权重到每个特征维度上,不让权重集中在某些维度上,出现权重特别高的特征。
而l1正则化,它对于最后的特征权重的影响是,让特征获得的权重稀疏化,也就是对结果影响不那么大的特征,干脆就拿不着权重。

可见,L1正则化对特征有选择的作用

5.数据标准化,一般是把所有特征取值放缩到(0,1)or(-1,1),因为SGD对于数据大小很敏感
sklearn的standardscaler
from sklearn import preprocessing
X就是所有特征
normalized_X = preprocessing.normalize(X)

standardized_X = preprocessing.scale(X)

#coding=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsdef dataload():'''read txt data,make data and label list'''filename = 'Iris data.txt'data = list()label = list()with open (filename) as f:lines = f.readlines()for line in lines:line = line.strip().split(',')single_data = list()for i in range(len(line)-1):                single_data.append(float(line[i]))                            data.append(single_data)label.append(line[4])return data, labeldef data_visualize():data = pd.read_csv('Iris data.csv')dataframe = pd.DataFrame(data)return dataframedef pair_plot(dataframe):# 利用pairplot来绘制两个特征之间的关系_ = sns.pairplot(dataframe, vars=['Sepal.Length','Sepal.Width','Petal.Length','Petal.Width'], hue='Type',markers=['x','o','*'])plt.rcParams['figure.figsize']=(13,13)plt.show()def cor_plot(dataframe):# 用于求解不同列之间的相关系数# 可见heatmap是呈左对角线对称分布的# 可以用这种方法进行特征筛选,保留相关性强的特征#dataframe = dataframe[['Sepal.Length','Sepal.Width','Petal.Length','Petal.Width']]corr = dataframe.corr()_ = sns.heatmap(corr,cmap='Blues',annot=False)#print corrplt.show()def feature_class(dataframe):# 绘制不同的特征和类别之间的关系# 可见这里与cor plot展示的是一样的plt.rcParams['figure.figsize']=(13,13)plt.subplot(2,2,1)_ = sns.stripplot(x='Type',y='Sepal.Length',data=dataframe)plt.subplot(2,2,2)_ = sns.stripplot(x='Type',y='Sepal.Width',data=dataframe)plt.subplot(2,2,3)_ = sns.stripplot(x='Type',y='Petal.Length',data=dataframe)plt.subplot(2,2,4)_ = sns.stripplot(x='Type',y='Petal.Width',data=dataframe)plt.show()def feature_distribution(dataframe):# 分析每个特征的所有值的分布规律# 这个仅仅是在分析重要的特征时候才用到plt.rcParams['figure.figsize']=(13,13)plt.subplot(2,2,1)_ = sns.distplot(dataframe[('Sepal.Length')])plt.subplot(2,2,2)_ = sns.distplot(dataframe[('Sepal.Width')])plt.subplot(2,2,3)_ = sns.distplot(dataframe[('Petal.Length')])plt.subplot(2,2,4)_ = sns.distplot(dataframe[('Petal.Width')])plt.show()if __name__ == '__main__':dataframe = data_visualize()feature_distribution(dataframe)

对于模型训练之后要采用交叉验证 ,用valid data测试模型。
最好的方法就是绘制Learning curve

from sklearn.svm import LinearSVC
from sklearn.learning_curve import learning_curve
#绘制学习曲线,以确定模型的状况
def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,train_sizes=np.linspace(.1, 1.0, 5)):"""画出data在某模型上的learning curve.参数解释----------estimator : 你用的分类器。title : 表格的标题。X : 输入的feature,numpy类型y : 输入的target vectorylim : tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点cv : 做cross-validation的时候,数据分成的份数,其中一份作为cv集,其余n-1份作为training(默认为3份)"""plt.figure()
train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=5, n_jobs=1, train_sizes=train_sizes)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)plt.fill_between(train_sizes, train_scores_mean - train_scores_std,train_scores_mean + train_scores_std, alpha=0.1,color="r")
plt.fill_between(train_sizes, test_scores_mean - test_scores_std,test_scores_mean + test_scores_std, alpha=0.1, color="g")
plt.plot(train_sizes, train_scores_mean, 'o-', color="r",label="Training score")
plt.plot(train_sizes, test_scores_mean, 'o-', color="g",label="Cross-validation score")plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.grid("on") 
if ylim:plt.ylim(ylim)
plt.title(title)
plt.show()
#少样本的情况情况下绘出学习曲线
plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",X, y, ylim=(0.8, 1.01),train_sizes=np.linspace(.05, 0.2, 5))

更多推荐

ML数据分析

本文发布于:2024-03-11 20:01:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729792.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   ML

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!