【问题标题】:How to evaluate the effect of different methods of handling missing values?如何评估处理缺失值的不同方法的效果?
【发布时间】:2022-01-15 17:34:01
【问题描述】:

我是一个初学者,我正在尝试比较处理缺失数据的不同方法。为了评估每种方法的效果(删除具有缺失值的原始数据、删除缺失值超过 40% 的列、用均值估算、用 KNN 估算),我在训练集上比较了 LDA 准确度和 LogReg 准确度的结果在具有 10% 缺失值、20% 缺失值的数据集与原始完整数据集的结果之间。不幸的是,即使在完整数据集和缺失 20% 的数据集之间,我也得到了几乎相同的结果。我不知道我做错了什么。

from numpy import nan
    from numpy import isnan

    from pandas import read_csv
    from sklearn.impute import SimpleImputer

    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
    from sklearn.model_selection import KFold
    from sklearn.model_selection import cross_val_score


    #dataset = read_csv('telecom_churn_rev10.csv')
    dataset = read_csv('telecom_churn_rev20.csv')
    dataset = dataset.replace(nan, 0)

    values = dataset.values
    X = values[:,1:11]
    y = values[:,0]


    dataset.fillna(dataset.mean(), inplace=True)
    #dataset.fillna(dataset.mode(), inplace=True)
    print(dataset.isnull().sum())
    imputer = SimpleImputer(missing_values = nan, strategy = 'mean')
    transformed_values = imputer.fit_transform(X)
    print('Missing: %d' % isnan(transformed_values).sum())


    model = LinearDiscriminantAnalysis()

    cv = KFold(n_splits = 3, shuffle = True, random_state = 1)
    result = cross_val_score(model, X, y, cv = cv, scoring = 'accuracy')
    print('Accuracy: %.3f' % result.mean())
    #print('Accuracy: %.3f' % result.mode())

    print(dataset.describe())
    print(dataset.head(20))

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

    from sklearn.preprocessing import StandardScaler
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)

    from sklearn.linear_model import LogisticRegression
    classifier = LogisticRegression(random_state = 0)
    classifier.fit(X_train, y_train)

    y_pred = classifier.predict(X_test)

    from sklearn.metrics import confusion_matrix, accuracy_score
    cm = confusion_matrix(y_test, y_pred)
    print(cm)
    accuracy_score(y_test,y_pred)

    from sklearn import metrics
    # make predictions on X
    expected = y
    predicted = classifier.predict(X)
    # summarize the fit of the model
    print(metrics.classification_report(expected, predicted))
    print(metrics.confusion_matrix(expected, predicted))

    # make predictions on X test
    expected = y_test
    predicted = classifier.predict(X_test)
    # summarize the fit of the model
    print(metrics.confusion_matrix(expected, predicted))
    print(metrics.classification_report(expected, predicted))

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python missing-data imputation


【解决方案1】:

您在该行将所有缺失值替换为 0:dataset = dataset.replace(nan, 0)。在此行之后,您将拥有一个没有缺失值的完整数据集。所以,.fillna()SimpleImputer() 在该行之后就没用了。

【讨论】:

  • 非常感谢您的回复!问题是当我不进行从 nan 到 0 的转换时,我收到此错误:“输入包含 NaN、无穷大或对于 dtype('float64') 而言太大的值”。我觉得除非我转换为 0,平均值无法计算,因此无法估算。有没有办法用这些列的各自平均值替换给定列中的零?提前感谢您的宝贵时间!
  • 您在哪一行出现此错误?我认为这是在那一行:result = cross_val_score(model, X, y, cv = cv, scoring = 'accuracy') 你需要使用transformed_values 而不是 X
  • 谢谢!在摆脱“dataset = dataset.replace(nan, 0”并在此处替换 X 后:result = cross_val_score(model, X, y, cv = cv,scoring = 'accuracy') 和此处:predicted = classifier.predict( X) 使用transformed_values,错误得到解决,但结果仍然与原始完整数据集几乎相同。LDA 准确度(原始数据集) - 0.850,LDA 准确度(具有 20% 缺失值的同一数据集,用平均值估算) - 0.848. LogReg (original) - 0.87, LogReg (imputed) - 0.87. 这是正常的吗?
  • 这取决于您的数据(数据丢失的方式和原因)。插补并不总能显着提高您的准确性
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多