# -- 监督学习 之 数据预处理
#------------------------
import numpy as np
from sklearn import preprocessing
data=np.array([[3,-1.5,2,5.4],[0,4,-0.3,2.1],[1,3.3,-1.9,-4.3]])# 创造 array 数组
# (data.mean():计算整体均值; data.mean(axis=0):计算每列均值;data.mean(axis=1):计算每行均值)
## 1. 数据预处理方式
# 1.1 均值移除(标准化)
datas1=preprocessing.scale(data)# -- 每列标准化:等价 (data-data.mean(axis=0))/data.std(axis=0)
# 1.2 范围缩放(范围标准化)
dataser=preprocessing.MinMaxScaler(feature_range=(0,1))# 设计取值范围规则
datas2=dataser.fit_transform(data)# 规则作用于数据data: 等价 (data-data.min(axis=0))/(data.max(axis=0)-data.min(axis=0))
# 1.3 归一化: 将特征向量调整为L1范数,使特征向量的数值之和为1.
datas3=preprocessing.normalize(data,norm='l1')# 确保数据点没有因为特征的基本性质而产生较大的差异,确保数据处于同一数量级,提高不同特征数据的可比性。
# 1.4 二值化: 将数值特征向量转换为 布尔类型 向量
datas4=preprocessing.Binarizer(threshold=1.4).transform(data)
# 1.5 独热编码: 将所有变量 唯一值进行 排序,然后将变量进行 根据有无 规则 转换为 0/1组成的向量
# (**解决问题**:由于分类器往往默认数据数据是连续的,并且是有序的,但是在很多机器学习任务中,存在很多离散(分类)特征,因而将特征值转化成数字时,往往也是不连续的, One-Hot 编码解决了这个问题。)
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transform([[0, 1, 3]]).toarray()
## 2. 标记编码方式 : 将单词标记 转化为数值形式。
label_encoder=preprocessing.LabelEncoder()# 定义一个标记编码器
input=['audi','ford','audi','toyota','ford','bmw']# 标记
label_encoder.fit(input)# 对标记进行编码
# 显示标记规则
for i,item in enumerate(label_encoder.classes_):
print(item,'-->',i)
test1=label_encoder.transform(['toyota','ford','audi'])# 利用以上的标记规则进行编码
print(list(test1))
test2=label_encoder.inverse_transform([0,3,1,2])# 反向还原
print(test2)
#-------------- 线性回归
# 3. 简单线性回归模型
# 3.1 划分 训练集 和 测试集
num_training=int(0.8*len(x))
num_test=len(x)-num_training
# 训练集
x_train=np.array(x[:num_training]).reshape((num_training,1))
y_train=np.array(y[:num_training])
# 测试集
x_test=np.array(x[:num_test]).reshape((num_test,1))
y_test=np.array(y[:num_test])
# 3.2 回归操作
from sklearn import linear_model
reg=linear_model.LinearRegression()# 建立回归对象
# 训练集训练
reg.fit(x_train,y_train)# 训练
# 查看回归效果
import matplotlib.pyplot as plt
yhat=reg.predict(x_train)# 得到训练集的拟合值
plt.figure()
plt.scatter(x_train,y_train,color='green',s=3)
plt.plot(x_train,yhat,color='blue',linewidth=1)
plt.title('Training Data')
plt.show()
# 3.3 利用回归结果来 对 测试集 预测 评级 预测效果
y_testhat=reg.predict(x_test)
import sklearn.metrics as sm# 评价效果模块
xg1=round(sm.mean_absolute_error(y_testhat,y_test),2)# 平均绝对误差
xg2=round(sm.mean_squared_error(y_testhat,y_test),2)# 均方误差(MSE)
xg3=round(sm.median_absolute_error(y_testhat,y_test),2)# 中位数绝对误差(MSE)
xg4=round(sm.explained_variance_score(y_testhat,y_test),2)# 解释方差得分: 衡量模型对数据集波动的解释能力,1分时,效果最好
xg5=round(sm.r2_score(y_testhat,y_test),2)# R2值 2为取小数位数
# 4. 创造岭回归器 解决普通线性回归对 异常值敏感 问题: 引入正则化项 的系数作为阀值来消除异常值影响
ridge_reg=linear_model.Ridge(alpha=0,fit_intercept=True,max_iter=1000)# 建立岭回归器
# (alpha 这里调节 修正程度, 0=普通回归,值越大对极端值越不敏感)
ridge_reg.fit(x_train,y_train)
yridgehat=ridge_reg.predict(x_train)
# 查看回归效果
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(x_train,y_train,color='green',s=3)
plt.plot(x_train,yridgehat,color='red',linewidth=1)
plt.title('Training Data')
plt.show()
#--5. 多项式拟合回归
from sklearn.preprocessing import PolynomialFeatures
ploynmial=PolynomialFeatures(degree=3)# 多项式次数设置为3次
xtr=ploynmial.fit_transform(x_train)# 计算x_train的 0,1,2,3次方 数据准备
poly_linear_model=reg.fit(xtr,y_train)# 多项式拟合
ypolyhat=poly_linear_model.predict(xtr)# 得到拟合结果
领取专属 10元无门槛券
私享最新 技术干货