3.データ閲覧によるモデル性能の向上2

31042 ワード

3.1.5数値型変数を正規分布にする


log変換による前処理


学習
  • でデータ分布にばらつきが生じると、
  • を見つけることが困難になる.
  • 限定のケースしか勉強していないので...バランスが重要です
    plt.figure(figsize = (10, 8))
    sns.distplot(df.loc[df.Insulin>0, 'Insulin'])
    plt.show()
  • 左傾斜形状
  • Log変換して形の変換をします!
  • plt.figure(figsize = (10, 8))
    sns.distplot(np.log(df.loc[df.Insulin>0, 'Insulin']+1))
    plt.show()
  • log(0)=-提供+1
  • log変換で尻尾を伸ばし、全体をスケーリングします.
  • df['Insulin_log'] = np.log(df['Insulin_nan'] + 1)
    fig, axes = plt.subplots(1, 2, figsize = (15, 5))
    sns.distplot(df['Insulin_nan'], ax = axes[0])
    sns.distplot(df['Insulin_log'], ax = axes[1])
    plt.show()
  • の中位数で充填する、真ん中が尖った
  • は2つのピーク
  • を生成する.
  • もログ変換前に左に傾き、右長尾分布
  • である.
  • 以降インスリンnanを除去し、学習と予測!
  • 3.1.6関連分析による派生変数の作成


    皮膚の厚さはBMIと相関性が高い

    plt.figure(figsize= (10, 8))
    sns.lmplot(data = df, x = 'Insulin_nan', y = 'Glucose', hue = 'Outcome')
    plt.show()
  • インスリンとマンニトールの相関を理解する
  • 未発症時の傾きはさらに急であった.
  • df['low_glu_insulin'] = (df['Glucose'] < 100) & (df['Insulin_nan'] <= 102.5)
    df[['low_glu_insulin']].head()
  • インスリン値は充填中心値より低く、Glucos値が100未満の変数
  • を誘導する.
    pd.crosstab(df['Outcome'], df['low_glu_insulin'])
  • 派生変数とOutcomeの等しい比較(==)をtabelに生成
  • 誘導変数がTrueの場合に発症した5例.かなり低い
  • features = df.columns.tolist()
    features.remove('Pregnancies')
    features.remove('Outcome')
    features.remove('Age_low')
    features.remove('Age_middle')
    features.remove('Age_high')
    features.remove('Insulin')
    features.remove('Insulin_nan')
    
    train = df[: int(df.shape[0] * 0.8)]
    test = df[int(df.shape[0] * 0.8): ]
    
    model.fit(train[features], train[label_name])
    y_pred = model.predict(test[features])
    diff_count = sum(abs(y_pred - test[label_name]))
    print('Accuracy: {}'.format((len(y_test) - diff_count) / len(y_test)))
    sns.barplot(y = features, x = model.feature_importances_)
    plt.show()
  • 精度に差はありません.新しく作成した変数には差はありません.
  • 3.1.7処理異常値

    fig, axes = plt.subplots(2, 1, figsize = (15, 6))
    sns.boxplot(df.Insulin, ax = axes[0])
    sns.boxplot(df['Insulin_nan'], ax = axes[1])
    plt.show()
  • に加南処理前、下加南処理後.
  • の分布はもっと狭く、もちろんヒゲも
  • より小さくなります.
    df['Insulin_nan'].describe()
  • q 1==q 2(median)は、0を複数のmedianに充填するためである
  • の最大値はq 3より5倍近く大きいですが、これは理想値に近いのではないでしょうか.
  • ### IQR
    IQR3 = df['Insulin_nan'].quantile(.75)
    IQR1 = df['Insulin_nan'].quantile(.25)
    IQR = IQR3 - IQR1
    IQR
  • Pandasの.quantileを使用して、所望のビット数を得ることができる.
  • ではなく、descripeのインデックスを取得して値を取得できます.
  • でない場合は、ソート後に必要な分数のインデックス値を入力してインデックスを作成できます.
  • OUT = IQR3 + 1.5*IQR
    OUT
  • box-plotには、下のヒゲよりも小さい異常値はないので、上のヒゲを基準に異常値
  • を除去する.
  • 2270より大きい場合、異常値
  • となる.
    df[df['Insulin_nan'] > OUT].shape
  • は合計700以上のデータがあり、51個のデータを削除すると
  • よりやや多い.
    従って、600を基準として異常値とみなし、実測値を処理する.
    print(df[df['Insulin_nan'] > 600].shape)
    train = df[df['Insulin_nan'] <= 600]
  • 3件しかないので除外すると
  • print(df[df['Insulin_nan'] > 600].shape)
    train = train[train['Insulin_nan'] <= 600]
    test = test[test['Insulin_nan'] <= 600]
    features = df.columns.tolist()
    features.remove('Pregnancies')
    features.remove('Outcome')
    features.remove('Age_low')
    features.remove('Age_middle')
    features.remove('Age_high')
    features.remove('Insulin')
    features.remove('Insulin_log')
    
    model.fit(train[features], train[label_name])
    y_pred = model.predict(test[features])
    diff_count = sum(abs(y_pred - test[label_name]))
    print('Accuracy:', (len(test[label_name]) - diff_count) / len(test[label_name]))
  • の精度は87%であった.そんなに大きな違いは...
  • 90%を超える場合もあるので最適ではなく
  • である.

    3.1.8特徴スケーリング


    StandardSclaer


    例えば
  • 、x 1は単位km、x 2はmを表す.100 m、x 2が1、x 1が0.1を表します.
  • x 2の値はx 1の10倍ですが、これは正しい場合ですか?
  • のように、各特徴の単位が異なると、同じ値でもその影響は異なる.
  • したがって、モデルはScraingによってのみその値の一意の影響を反映する
    from sklearn.preprocessing import StandardScaler
    ## z표준화 스케일러 생성
    scaler = StandardScaler()
    ## 변환하고 싶은 df or array 넣어주고 fitting
    scaler.fit(df[['Glucose', 'DiabetesPedigreeFunction']])
    ## 변환
    scale = scaler.transform(df[['Glucose', 'DiabetesPedigreeFunction']])
    scale
    tmp = df[['Glucose', 'DiabetesPedigreeFunction']].copy() 
    tmp[['Glucose', 'DiabetesPedigreeFunction']] = scale
    print(tmp.head())
    ## min-max scaling
    tmp2 = df[['Glucose', 'DiabetesPedigreeFunction']].copy() 
    tmp2 = tmp2.apply(lambda x: (x - min(x)) / (max(x) - min(x)), axis = 0)
    print(tmp2.head())
  • は、一連を変更するだけでなく、dfの形式
  • を変更することもできる.
  • scalerの変換結果はarray
  • h = df[['Glucose', 'DiabetesPedigreeFunction']].hist(figsize = (15, 3))
    h2 = tmp.hist(figsize = (15, 3))
    h3 = tmp2.hist(figsize = (15, 3))
  • スケール前後のヒストグラム
  • 平均値
  • を除いてstdに分けます.単位差を解消し、純観測値の影響のみを残す
  • ヒストグラムの形状は両者が同じと考えられ,
  • scaling自体は値の変化を生じたが,分布は変化しなかった.
  • スケールはこの項目にあまり影響しません。他の項目で精度を上げることができるので、EDAを行い、サイトを取得してから前処理を行うのが望ましい。


    3.1.9前処理の特徴を保存する

    df.to_csv('/content/drive/MyDrive/edwith/프로젝트로 배우는 데이터 사이언스/data/diabetes_feature.csv', index = False)
    pd.read_csv('/content/drive/MyDrive/edwith/프로젝트로 배우는 데이터 사이언스/data/diabetes_feature.csv').head()
  • to csvでは、index=falseが指定されていない場合、インデックスはカラムの0番目の場所
  • に一緒に格納されます.