使用sklearn解决机器学习问题

1.读入数据

import pandas as pd
housing = pd.read_csv("/Users/ff/PycharmProjects/prac_skl/datasets/housing/housing.csv")

2.观察数据

# housing.head() 输出前5行数据及表头
# housing.info() 输出每个特征的元素总个数及类型信息
# housing["ocean_proximity"].value_counts() 输出特征"ocean_proximity"列每个元素出现的总个数
# housing.describe() 显示数字属性的摘要(缺失值已经被自动忽略)
# 另一种快速了解数据的方法是绘制直方图
# 在整个数据集上调用hist()方法,为每个数字属性绘制直方图
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15)) # 默认bins=10 通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸
plt.show()

3.分开训练集和测试集

from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

4.查看训练集的特征图像信息以及特征之间的相关性

5.数据预处理

(1)标准化

数据集的 标准化 (标准正态分布(具有零均值和单位方差))对scikit-learn中实现的大多数机器学习算法来说是 常见的要求 。许多学习算法中目标函数的基础都是假设所有的特征都是零均值并且具有同一阶数上的方差。如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们所期望的那样,从其他特征中学习。

from sklearn import preprocessing
X_scaled = preprocessing.scale(X_train) # 函数 scale 为数组形状的数据集的标准化提供了一个快捷实现
# 或者:
scaler = preprocessing.StandardScaler().fit(X_train)
X_scaled = scaler.transform(X_train) 

预处理 模块还提供了一个实用类 StandardScaler,它实现了转化器的API来计算训练集上的平均值和标准偏差,以便以后能够在测试集上重新应用相同的变换。

1️⃣将特征缩放至特定范围内MinMaxScaler将数据矩阵缩放到[0, 1],(X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

 和 MaxAbsScaler通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1] 范围内,X / X.max(axis=0)

2️⃣缩放稀疏(矩阵)数据:MaxAbsScaler 以及 maxabs_scale 是专为缩放数据而设计的,并且是缩放数据的推荐方法。如果已经中心化的数据并不是很大,使用 toarray 方法将输入的稀疏矩阵显式转换为数组是另一种选择。

扫描二维码关注公众号,回复: 5145041 查看本文章

3️⃣缩放有离群值的数据:如果你的数据包含许多异常值,使用均值和方差缩放可能并不是一个很好的选择。这种情况下,你可以使用 robust_scale以及 RobustScaler 作为替代品。

(2)非线性转换

类似于缩放, QuantileTransformer 类将每个特征缩放在同样的范围或分布情况下。但是,通过执行一个秩转换能够使异常的分布平滑化,并且能够比缩放更少地受到离群值的影响。但是它的确使特征间及特征内的关联和距离失真了。

QuantileTransformer 类以及 quantile_transform 函数提供了一个基于分位数函数的无参数转换,将数据映射到了0到1的均匀分布上。

np.percentile详解:https://blog.csdn.net/brucewong0516/article/details/80205422?utm_source=blogxgwz7

也可以通过设置 output_distribution='normal' 将转换后的数据映射到正态分布:

quantile_transformer = preprocessing.QuantileTransformer(output_distribution='normal', random_state=0)

(3)归一化

归一化 是 缩放单个样本以具有单位范数 的过程(axis=1)。如果你计划使用二次形式(如点积或任何其他核函数)来量化任何样本间的相似度,则此过程将非常有用。

函数 normalize 提供了一个快速简单的方法在类似数组的数据集上执行操作。

(4)二值化

特征二值化 是 将数值特征用阈值过滤得到布尔值 的过程。

binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)

(5)分类特征编码

一种将分类特征(非数值型的)转换为能够被scikit-learn中模型使用的编码是one-hot编码,在 OneHotEncoder 中实现。这个类使用 m 个可能值转换为 m 值化特征,将分类特征的每个元素转化为一个值。

详解:http://www.cnblogs.com/Jerry-home/p/9824085.html

注意,如果训练集中有丢失的分类特征值,必须显式地设置 n_values。

>>> enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])
>>> # 注意到第二个和第三个特征是不全的
>>> enc.fit([[1, 2, 3], [0, 2, 0]])  
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values=[2, 3, 4], sparse=True)
>>> enc.transform([[1, 0, 0]]).toarray()
array([[ 0.,  1.,  1.,  0.,  0.,  1.,  0.,  0.,  0.]])

(6)缺失值插补

Imputer 类提供了估算缺失值的基本策略,使用缺失值所在的行/列中的平均值、中位数或者众数来填充。

(7)生成多项式特征

在机器学习中,通过增加一些输入数据的非线性特征来增加模型的复杂度通常是有效的。一个简单通用的办法是使用多项式特征,这可以获得特征的更高维度和互相间关系的项。这在 PolynomialFeatures 中实现。

在一些情况下,只需要特征间的交互项,这可以通过设置 interaction_only=True 来得到。

6.选择及训练模型

交叉验证;保存模型

7.模型调参

网格搜索;随机搜索

一个简单的分类的例子:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris = datasets.load_iris()
iris_X = iris.data
iris_y = iris.target

X_train,X_test,y_train,y_test = train_test_split(iris_X,iris_y,test_size=0.3)

knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print(knn.predict(X_test))
print(y_test)

猜你喜欢

转载自blog.csdn.net/aa_JamesJones/article/details/84315120