本系列是针对《机器学习实战》蜥蜴书第二版自己的总结,结合吴恩达的ML课部分理论内容。
这里拿泰坦尼克这个经典例子来说明对于机器学习算法的数据清洗技术。
观察数据
首先从kaggle下载数据得到 train.csv 和 test.csv
加载数据
train_data = pd.read_csv('drive/Colab Notebooks/ml/datasets/titanic/train.csv')
test_data = pd.read_csv('drive/Colab Notebooks/ml/datasets/titanic/test.csv')
查看一下表的基本信息:
train_data.head()
得到相应列:
- Survived:目标数据,0-死亡,1-生存
- Pclass: 乘客所属类别
- Name, Sex, Age: 个人信息
- SibSp: 乘客在船上的配偶人数
- Parch: 乘客在船上的孩子、父母的人数
- Ticket: 票号
- Fare: 消费
- Cabin: 所在船舱号
- Embarked: 在何处上船
查看有多少缺失数据
train_data.info()
年龄、船舱号、上船位置有部分缺失,且船舱号大量缺失,后期可考虑舍弃。
查看数值列:
train_data.describe()
可以从上面数据发现:
- 仅有38%的人存活,也就说明模型估计的目标也应该在40%左右。
- 平均费用达到了32法郎,船上消费没有想象中的昂贵。
- 乘客平均年龄在30岁以下。
查看分类的特征:
train_data["Pclass"].value_counts()
train_data["Sex"].value_counts()
train_data["Embarked"].value_counts()
数据转换
建立一个DataframeSelector类来筛选特征:
from sklearn.base import BaseEstimator, TransformerMixin
class DataFrameSelector(BaseEstimator, TransformerMixin):
def __init__(self, attribute_names):
self.attribute_names = attribute_names
def fit(self, X, y=None):
return self
def transform(self, X):
return X[self.attribute_names]
建立num_pipeline处理数值数据
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
#将数值特征筛选后,用中位数填补空缺值
num_pipeline = Pipeline([
("select_numeric", DataFrameSelector(["Age", "SibSp", "Parch", "Fare"])),
("imputer", SimpleImputer(strategy="median")),
])
处理后的数据:
num_pipeline.fit_transform(train_data)
将类别特征转换成矩阵
# 用最常出现的类别填充空类别
class MostFrequentImputer(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X],
index=X.columns)
return self
def transform(self, X, y=None):
return X.fillna(self.most_frequent_)
针对类别的cat_pipeline,并进行onehot编码:
from sklearn.preprocessing import OneHotEncoder
cat_pipeline = Pipeline([
("select_cat", DataFrameSelector(["Pclass", "Sex", "Embarked"])),
("imputer", MostFrequentImputer()),
("cat_encoder", OneHotEncoder(sparse=False)),
])
cat_pipeline.fit_transform(train_data)
将分类pipline和数值pipline融合:
from sklearn.pipeline import FeatureUnion
preprocess_pipeline = FeatureUnion(transformer_list=[
("num_pipeline", num_pipeline),
("cat_pipeline", cat_pipeline),
])
最后fitpipline:
X_train = preprocess_pipeline.fit_transform(train_data)
X_train
设定目标列,处理完成:
y_train = train_data["Survived"]
用svc进行预测
训练模型
from sklearn.svm import SVC
svm_clf = SVC(gamma="auto")
svm_clf.fit(X_train, y_train)
训练完成,接下来预测试试:
X_test = preprocess_pipeline.transform(test_data)
y_pred = svm_clf.predict(X_test)
交叉验证:
from sklearn.model_selection import cross_val_score
svm_scores = cross_val_score(svm_clf, X_train, y_train, cv=10)
svm_scores.mean()
结果还不错。
到这里学习机器学习的准备工作就完成了,这里总结一下数据处理的流程:
- 利用pandas和numpy来完成数据准备,确定有哪些数据和缺失值如何处理
- 利用sklearn的BaseEstimator,TransformerMixin完成特征筛选
- 利用pipline,imputer完成缺失值填补,矩阵转换
- 特别的,表示类别的特征需要用OneHotEncoder来进行编码。