数据预处理
由于机器学习目前很多东西,没有形成有条的梳理,并且知识点缺失严重,所以想打算从新开始学习,主要根据别人的知识点梳理,自己打算重新动手实现一遍。参考资料主要是GitHub上的机器学习100天,传输门:https://github.com/MLEveryday/100-Days-Of-ML-Code,希望更够认真加强练习。
首先,看下我们要处理的数据实例:
数据集
我们的目的是希望原始数据可以处理成机器学习可以直接计算的数据形式,对该数据集有以下操作关键。
1、缺失值数据处理
对缺失值处理,一般利用中位数、众数和平均数来填充。
2、处理分类特征的数据
像country和purchased这两列数据,不是数值大小,需要利用虚拟编码对其进行处理,比如,对于country这一列数据,要使用onehotEncoder处理。
3、将数据集分成训练集和测试集。
将数据集分成训练集和测试集是十分必要的,我们一般会随机地将数据集的25%或20%(一般不超过40%)数据设置为测试集,剩下的为训练集。这里我们设置20%为测试集。
4、特征缩放
特征缩放在一些机器学习算法中非常必要,比如在涉及到欧氏距离计算的算法、决策树算法。为了防止数值较大的自变量对数值较小的自变量的影响,或者在算法中希望收敛速度更快,关于特征缩放有以下两种方法(标准化和正常化)
注意对数据进行特征缩放,要视情况而定,比如salary和age这两列数据就可以进行特征缩放,但对于country和purchased需要视情况而定。
Python代码如下:
# 导入需要的库
import numpy as np
import pandas as pd
# 导入数据集,并划分自变量矩阵和因变量
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
# 利用每列平均值填充缺失值
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values = np.nan, strategy = 'mean')
imputer = imputer.fit(X[: , 1:3 ])
X[: ,1:3] = imputer.transform(X[:, 1:3])
# 上面一步还可以这样做代替
# from sklearn.impute import SimpleImputer
# imputer = SimpleImputer(missing_values = np.nan, strategy = 'mean')
# X[: ,1:3] = imputer.fit_transform(X[:, 1:3])
# 解析分类特征数据
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
# 创建虚拟变量,对第一列数据进行onehot,也就是country这列
onehotencoder = OneHotEncoder(categories = X[:, 0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
# 拆分数据集为训练集合和测试集合
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_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
下面介绍一个整体的数据处理例子
假设现在有这样一个场景:有一个数据集,每个样本包含n个数值型(numeric)特征,m个标称型(categorical)特征,我们在使用这个数据集训练模型之前,需要对n个数值型特征做归一化,对m个标称型特征做one-hot编码?这个要如何实现?
例子中对数值型特征做缺失值处理和归一化,对标称型特征做缺失值处理和One-Hot编码。例子里面使用Pipeline将这些操作串了起来。
from __future__ import print_function
import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, GridSearchCV
np.random.seed(0)
titanic_url = ('https://raw.githubusercontent.com/amueller/'
'scipy-2017-sklearn/091d371/notebooks/datasets/titanic3.csv')
data = pd.read_csv(titanic_url)
# 我们将建立我们的分类器用以下特征
# numberic features(数值特征)
# - age: float
# - fare: float
# categorical features (类别特征)
# - embarked: categories encoded as strings {'C', 'S', 'Q'}.
# - sex: categories encoded as strings {'female', 'male'}.
# - pclass: ordinal integers {1, 2, 3}.
# 预处理数值特征和类别特征
numeric_features = ['age', 'fare']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_features = ['embarked', 'sex', 'pclass']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# 添加分类器到预处理的pipeline中
clf = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', LogisticRegression(solver='lbfgs'))])
X = data.drop('survived', axis=1)
y = data['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf.fit(X_train, y_train)
print("model score: %.3f" % clf.score(X_test, y_test))
ColumnTransformer
网友评论