データ サイエンスの次の有名な引用を聞いたことがあるでしょう:
データ サイエンス プロジェクトでは、時間の 80% がデータ処理に費やされます。
聞いたことがない場合は、データ クリーニングはデータ サイエンス ワークフローの基礎であることを覚えておいてください。機械学習モデルは、提供されたデータに基づいて実行されます。乱雑なデータはパフォーマンスの低下や不正確な結果につながる可能性がありますが、良好なモデルのパフォーマンスの前提条件となるのはクリーンなデータです。もちろん、データがきれいだからといって常に優れたパフォーマンスが得られるわけではなく、モデル (残り 20%) を正しく選択することも重要ですが、データがきれいでなければ、最も強力なモデルであっても期待されるレベルを達成することはできません。
この記事では、データ クリーニングで解決する必要がある問題をリストし、考えられる解決策を示します。この記事を通じて、データ クリーニングを段階的に実行する方法を学ぶことができます。
データ セットに欠損データが含まれている場合、埋める前にデータ分析を実行できます。空のセルの位置自体から、いくつかの有用な情報が得られるからです。例:
missingno この Python ライブラリは、上記の状況を確認するために使用でき、非常に簡単に使用できます。たとえば、下の図の白い線は NA:
import missingno as msno msno.matrix(df)
欠損値を埋めるには、次のような多くの方法があります。
さまざまな方法にはそれぞれ長所と短所があり、すべての状況で機能する「最良の」技術はありません。詳細については、以前に公開された記事を参照してください。
外れ値は、データ セット内の他の点と比較して非常に大きい値または非常に小さい値です。それらの存在は、数学モデルのパフォーマンスに大きな影響を与えます。この簡単な例を見てみましょう:
左側のグラフには外れ値がなく、線形モデルはデータ ポイントに非常によく適合しています。右側の画像には外れ値があります。モデルがデータセットのすべてのポイントをカバーしようとすると、この外れ値の存在によってモデルの適合方法が変化し、モデルが少なくとも半分のポイントに適合しなくなります。
外れ値については、異常を判断する方法を導入する必要があり、これには数学的な観点から何が最大か最小かを明確にする必要があります。
Q3 1.5 x IQR より大きい値、または Q1-1.5 x IQR より小さい値は、外れ値と見なすことができます。 IQR (四分位範囲) は Q3 と Q1 の差です (IQR = Q3-Q1)。
次の関数を使用して、データ セット内の外れ値の数を確認できます。
def number_of_outliers(df): df = df.select_dtypes(exclude = 'object') Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()
外れ値に対処する 1 つの方法は、外れ値を Q3 または Q1 と等しくすることです。以下の lower_upper_range 関数は、pandas および numpy ライブラリを使用して、その外側に外れ値のある範囲を見つけ、clip 関数を使用して値を指定された範囲にクリップします。
def lower_upper_range(datacolumn): sorted(datacolumn) Q1,Q3 = np.percentile(datacolumn , [25,75]) IQR = Q3 - Q1 lower_range = Q1 - (1.5 * IQR) upper_range = Q3 + (1.5 * IQR) return lower_range,upper_range for col in columns: lowerbound,upperbound = lower_upper_range(df[col]) df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)
外れ値の問題は数値の特徴に関するものです。次に、文字タイプ (カテゴリ) の特徴を見てみましょう。データに一貫性がないということは、列の一意のクラスの表現が異なることを意味します。たとえば、性別の列には、m/f と男性/女性の両方があります。この場合、クラスは 4 つになりますが、実際には 2 つのクラスがあります。
現時点では、この問題を自動的に解決する方法はないため、手動で分析する必要があります。この分析にはパンダ独自の関数が用意されており、自動車ブランドの例を見てみましょう:
df['CarName'] = df['CarName'].str.split().str[0] print(df['CarName'].unique())
maxda-mazda、Nissan-nissan、porcshce-porsche、toyouta -トヨタなどを併合することができます。
df.loc[df['CarName'] == 'maxda', 'CarName'] = 'mazda' df.loc[df['CarName'] == 'Nissan', 'CarName'] = 'nissan' df.loc[df['CarName'] == 'porcshce', 'CarName'] = 'porsche' df.loc[df['CarName'] == 'toyouta', 'CarName'] = 'toyota' df.loc[df['CarName'] == 'vokswagen', 'CarName'] = 'volkswagen' df.loc[df['CarName'] == 'vw', 'CarName'] = 'volkswagen'
無効なデータは、論理的にまったく正しくない値を表します。たとえば、
数値列の場合、pandas の description 関数を使用してそのようなエラーを特定できます:
df.describe()
無効なデータには 2 つの理由が考えられます:
1. データ収集エラー: 入力時に範囲を判断できなかった例: 身長を入力する際、179cm を誤って 1799cm と入力しましたが、プログラムはデータの範囲を判断しませんでした。
2. データ操作エラー
数据集的某些列可能通过了一些函数的处理。 例如,一个函数根据生日计算年龄,但是这个函数出现了BUG导致输出不正确。
以上两种随机错误都可以被视为空值并与其他 NA 一起估算。
当数据集中有相同的行时就会产生重复数据问题。 这可能是由于数据组合错误(来自多个来源的同一行),或者重复的操作(用户可能会提交他或她的答案两次)等引起的。 处理该问题的理想方法是删除复制行。
可以使用 pandas duplicated 函数查看重复的数据:
df.loc[df.duplicated()]
在识别出重复的数据后可以使用pandas 的 drop_duplicate 函数将其删除:
df.drop_duplicates()
在构建模型之前,数据集被分成训练集和测试集。 测试集是看不见的数据用于评估模型性能。 如果在数据清洗或数据预处理步骤中模型以某种方式“看到”了测试集,这个就被称做数据泄漏(data leakage)。 所以应该在清洗和预处理步骤之前拆分数据:
以选择缺失值插补为例。数值列中有 NA,采用均值法估算。在 split 前完成时,使用整个数据集的均值,但如果在 split 后完成,则使用分别训练和测试的均值。
第一种情况的问题是,测试集中的推算值将与训练集相关,因为平均值是整个数据集的。所以当模型用训练集构建时,它也会“看到”测试集。但是我们拆分的目标是保持测试集完全独立,并像使用新数据一样使用它来进行性能评估。所以在操作之前必须拆分数据集。
虽然训练集和测试集分别处理效率不高(因为相同的操作需要进行2次),但它可能是正确的。因为数据泄露问题非常重要,为了解决代码重复编写的问题,可以使用sklearn 库的pipeline。简单地说,pipeline就是将数据作为输入发送到的所有操作步骤的组合,这样我们只要设定好操作,无论是训练集还是测试集,都可以使用相同的步骤进行处理,减少的代码开发的同时还可以减少出错的概率。
以上がPython を使用したデータ クリーニングの完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。