【问题标题】:Dealing with empty data points in Titanic Machine Learning train.csv处理泰坦尼克号机器学习 train.csv 中的空数据点
【发布时间】:2018-06-05 02:11:31
【问题描述】:

在泰坦尼克号机器学习项目的 train.csv 数据中,一些乘客的年龄数据丢失,因此 pandas 模块将其填充为“NaN”,并且在将其输入 sklearn 算法时它不接受它。我尝试了 dataset.fillna('') 但现在它变成了一个空字符串而不是一个浮点数。请发送帮助。

https://www.kaggle.com/c/titanic/data

import pandas as pd

from sklearn.cross_validation import train_test_split
dataset = pd.read_csv('train.csv')
#dataset = dataset.fillna()
def preprocess(df):
    from sklearn.preprocessing import LabelEncoder
    processed_df = df.copy()
    le = LabelEncoder()
    done = le.fit_transform(processed_df)
    return done
survival = preprocess(dataset.Survived)

data = dataset.drop('Survived',axis= 1)
data = data.drop('PassengerId',axis=1)
data = data.drop('Embarked',axis = 1)
data = data.drop('Cabin',axis = 1)
data = data.drop('Fare',axis = 1)
data = data.drop('Ticket',axis = 1)
data = data.drop('Name',axis=1)

x_train,x_test,y_train,y_test= 
train_test_split(data,survival,test_size=0.25,random_state=0)

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn import svm
from sklearn.metrics import accuracy_score


pipeline = make_pipeline(StandardScaler(),
                         svm.SVC(kernel='rbf',C=0.1))
pipeline.fit(x_train,y_train)
print(accuracy_score(pipeline.predict(x_test),y_test))

【问题讨论】:

    标签: python csv machine-learning scikit-learn svm


    【解决方案1】:

    fillna 用你写的替换 Nan 值,所以如果你写 '',它将是一个空字符串。随便写:

     dataset.fillna(0)
    

    如果需要区分0和Nan,可以尝试用-1代替,我们就是这样做的。

    【讨论】:

    • 但是算法不会把0作为连续值吗?我希望年龄是空的,什么都没有。但算法会接受它作为真实数据。
    • 据我所知,没有办法给 sklearn 算法提供空值。我有一种情况,我在考试中获得了分数,当然,0 分或 Nan 之间存在差异,这意味着他没有参加考试。我们尝试了两种方法来解决这个问题:如果测试分数是一个主要特征,那么您可以将人群分成参加考试的人和没有参加考试的人。如果像我的情况一样,它是一个小功能,而不是我们通过给它一个与其他值不同的值作为 -1 来处理它,它工作得很好,但它可能会根据你的算法而有所不同
    • 另一种方法是将 Nan 替换为列平均值
    • @5Volts 您需要按照 Drza 的建议估算 Nan 值。有多种技术可以做到这一点。 scikit-learn 包含一个 Imputer 或者您可以完全删除该列。您需要在这里测试最适合您的方法。
    【解决方案2】:

    您可以使用多种方法来处理机器学习项目中的缺失值:

    1. 删除所有缺失值的列
    2. 删除包含缺失值的行
    3. 将值设置为某个值(零、平均值、中位数等)。

    对于第三个选项:

    Scikit-Learn 提供了一个方便的类来处理缺失值: 估算器。以下是如何使用它。首先,您需要创建一个 Imputer 实例,指定要替换每个属性的缺失 具有该属性中位数的值:

    from sklearn.preprocessing import Imputer
    imputer = Imputer(strategy="median") #or mean as you want 
    x_train = imputer.fit_transform(x_train)
    x_test = imputer.fit_transform(x_test)
    

    结果是一个包含转换特征的普通 Numpy 数组。如果你想把它放回 Pandas DataFrame,很简单。

    注意:您也可以在管道中添加插补器,就在缩放器之前。

    pipeline = make_pipeline(Imputer(strategy="median"),
                             StandardScaler(),
                             svm.SVC(kernel='rbf',C=0.1))
    

    【讨论】:

    • StandardScaler 将抛出 Nan 值错误。 Imputer 应该是第一位的。
    • 是的,你是对的@VivekKumar,我只是更改顺序并编辑我的答案;让我知道如何改进它
    猜你喜欢
    • 2019-02-28
    • 1970-01-01
    • 2019-03-01
    • 2020-10-25
    • 2017-06-27
    • 2016-06-19
    • 2022-01-03
    • 2021-07-29
    • 2022-07-25
    相关资源
    最近更新 更多