解决Kaggle的《泰坦尼克号机器学习》

时间:2018-10-03 18:13:51

标签: python machine-learning scikit-learn kaggle

我正在尝试使用Python解决Kaggle的《泰坦尼克号》。 但是我在尝试拟合数据时出错。 这是我的代码:

let result = arr.reduce(function(ret, row) {
   // assuming `xyz` can be only `null` or an object
   if ( row.xyz !== null ) {
     ret.push(row.xyz.xyz_id);
   }
   return ret;
}, []); 

错误是这样的:

import pandas as pd
from sklearn import linear_model

def clean_data(data):
    data["Fare"] = data["Fare"].fillna(data["Fare"].dropna().median())
    data["Age"] = data["Age"].fillna(data["Age"].dropna().median())

    data.loc[data["Sex"] == "male", "Sex"] = 0
    data.loc[data["Sex"] == "female", "Sex"] = 1

    data.loc["Embarked"] = data["Embarked"].fillna("S")
    data.loc[data["Embarked"] == "S", "Embarked"] = 0
    data.loc[data["Embarked"] == "C", "Embarked"] = 1
    data.loc[data["Embarked"] == "Q", "Embarked"] = 2

train = pd.read_csv("train.csv")

clean_data(train)

target = train["Survived"].values
features = train[["Pclass", "Age","Sex","SibSp", "Parch"]].values

classifier = linear_model.LogisticRegression()
classifier_ = classifier.fit(features, target) # Here is where error comes from

你能帮我吗?

3 个答案:

答案 0 :(得分:0)

在使模型具有特征和目标之前,最佳实践是检查要在构建模型时使用的所有特征中是否存在空值。您可以在下面了解一下

  
    
      

dataframe_name.isnull()。any(),如果存在至少一个Nan值,它将给出列名和True

             

dataframe_name.isnull()。sum()这将给出列名和存在的NaN值的值

    
  

通过知道列名,然后执行数据清除。 这不会造成NaN问题。

答案 1 :(得分:0)

在运行任何sklearn代码之前,您应该重置数据帧的索引:

df = df.reset_index()

答案 2 :(得分:0)

Nan仅表示数据集中的空,无或空值。首先,在对数据集应用某些ML算法之前,首先需要对数据集进行预处理,以进行简化的处理。换句话说,这称为数据清理。您可以使用scikit Learn的imputer模块来处理Nan。

如何检查数据集是否具有Nan
数据框的isnan()返回一个True / False值列表,以显示某列是否包含Nan。例如,

  str = pd.Series(['a','b',np.nan, 'c', 'np.nan'])
  str.isnull()
  out: False, False, True, False, True


然后str.isnull().sum()将返回系列中存在的空值的数量。在这种情况下,为“ 2”。 您可以将此方法应用于数据框本身,例如df.isnan()

我知道处理Nan 的两种技术:
1。删除包含Nan的行。
例如 str.dropna()str.dropna(inplace=True)df.dropna(how=all)
 但这会从数据集中删除许多有价值的信息。因此,大多数情况下我们避免这样做。
2.插入:用列的平均值/中位数替换Nan值。

 from sklearn.preprocessing import Imputer
 imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) 
 #strategy can also be median or most_frequent 
 imputer = imputer.fit(training_data_df)
 imputed_data = imputer.fit_transform(training_data_df.values)
 print(imputed_data_df)

我希望这会对您有所帮助。