对于一个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

MERFISH数据分析 mlva数据分析_数据分析


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 sns

def 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, label

def data_visualize():
    data = pd.read_csv('Iris data.csv')
    dataframe = pd.DataFrame(data)
    return dataframe

def 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 corr
    plt.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 vector
    ylim : 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))