概念
通过大量数据建立模型(分类模型, 回归模型, 聚类模型), 然后通过建立的模型对新的样本数据进行预测
算法分类
- 监督学习: 有特征值,有目标值
从目标值划分,如果目标值是离散类型(整数),分类模型;连续类型(小数),用回归模型。 - 无监督学习 : 有特征值,没有目标值
监督学习
- 三要素:模型,策略,算法
-
流程
监督学习流程图
知识点概要
-
数据集 train_test_split
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets -
特征工程 fit_transform ...
鸢尾花(iris)数据集分析
Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集,在统计学习和机器学习领域都经常被用作示例。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
1 数据采集
- scikit-learn数据集API介绍
sklearn.datasets #加载获取流行数据集
datasets.load_*() #获取小规模数据集,数据包含在datasets里
datasets.fetch_*(data_home=None) #获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
sklearn.datasets.load_iris() # 加载并返回鸢尾花数据集
import pandas as pd #数据处理+可视化
import numpy as np #数值处理
import matplotlib.pyplot as plt # 数据可视化
from sklearn.datasets import load_iris #导入数据集iris
%matplotlib inline # 内嵌画图
iris = load_iris() #载入数据集
iris.keys()
iris.data
iris.target #共150条记录,分别代表50条山鸢尾 (Iris-setosa)、变色鸢尾(Iris-versicolor)、维吉尼亚鸢尾(Iris-virginica)
iris.target_names
iris.feature_names
iris.png
2 数据处理
数据切分70%训练集,30%测试集
# 2、对鸢尾花数据集进行分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 随机数种子 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果随机数种子不一致:\n", x_train == x_train1)
print("如果随机数种子一致:\n", x_train1 == x_train2)
train data
特征工程
基本使用流程
## 数据标准化
## StandardScaler 标准化转化器类
ss = StandardScaler()
## fit_transform训练并转换
## fit在计算均值, 方差,transform完成转换并输出
X_train = ss.fit_transform(X_train)
X_train
特征抽取
- 字典特征提取 sklearn.feature_extraction.DictVectorizer
from sklearn.feature_extraction import DictVectorizer
# 创建转换器对象
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
dict_vec = DictVectorizer(sparse=True)
data = dict_vec.fit_transform(data)
print(dict_vec.get_feature_names())
# print(data.toarray()) # one-hot编码
print(data)
dict
- 文档词频统计 sklearn.feature_extraction.text.CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
# 把某段文本中的字词的特征进行提取--> 业务: 文本分类, 让词频作为分类特征
data = ["life is short,i like like python and and so on, and, and", "life is too long,i dislike python"]
t = CountVectorizer(stop_words=["and","or",'but']) # 停用词会维护一个语料库(文件)
data = t.fit_transform(data)
print(t.get_feature_names())
print(data.toarray())
count
- tf-idf特征提取 sklearn.feature_extraction.text.TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
# tf-idf统计 在实际开发中是主流, 通过他来完成文本特征的提取
data = ["life is short,i like like python and and so on, and, and", "and life is too long,i dislike python", "hdh and"]
t = TfidfVectorizer()
data = t.fit_transform(data)
print(t.get_feature_names())
print(data.toarray())
ft-id
特征处理
1.归一化
import pandas as pd # 导入pandas模块, 并且将pandas起别名: pd
# 加载数据, 数据预处理, 数据可视化,数据计算, 数据查询
from sklearn.preprocessing import MinMaxScaler
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = MinMaxScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print(data)
MinMaxScaler
2.无量纲化
from sklearn.preprocessing import StandardScaler
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = StandardScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print(data)
StandardScaler
特征降维
- 特征选择
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
方差选择法:低方差特征过滤
相关系数 - Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等
Filter(过滤式): 低方差特征过滤
# 某些股票的指标特征之间进行一个筛选
from sklearn.feature_selection import VarianceThreshold
data = pd.read_csv("factor_returns.csv")
# 1、实例化一个转换器类
transfer = VarianceThreshold(threshold=1)
# 2、调用fit_transform
data = transfer.fit_transform(data.iloc[:, 1:10])
data
VarianceThreshold
Filter(过滤式):相关系数
import pandas as pd
from scipy.stats import pearsonr
data = pd.read_csv("factor_returns.csv")
factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev',
'earnings_per_share', 'revenue', 'total_expense']
for i in range(len(factor)):
for j in range(i, len(factor) - 1):
print(
"指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0]))
// 指标revenue与指标total_expense之间的相关性大小为0.957188
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4), dpi=50)
plt.scatter(data['revenue'], data['total_expense'])
plt.show()
pearsonr
2.主成分分析(PCA)
# 对数据进行PCA降维
from sklearn.decomposition import PCA
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化PCA, 小数——保留多少信息
transfer = PCA(n_components=0.9)
# 2、调用fit_transform
data1 = transfer.fit_transform(data)
data1
# 1、实例化PCA, 整数——指定降维到的维数
transfer2 = PCA(n_components=3)
# 2、调用fit_transform
data2 = transfer2.fit_transform(data)
data2
PCA
分类算法
sklearn转换器和估计器
- 转换器
fit_transform = fit + transform, fit, transform- 估计器
在sklearn中,估计器(estimator)是一个重要的角色,是一类实现了算法的API
√ 用于分类的估计器:
∆ sklearn.neighbors k-近邻算法
∆ sklearn.naive_bayes 贝叶斯
∆ sklearn.linear_model.LogisticRegression 逻辑回归
∆ sklearn.tree 决策树与随机森林
√ 用于回归的估计器:
∆ sklearn.linear_model.LinearRegression 线性回归
∆ sklearn.linear_model.Ridge 岭回归
√ 用于无监督学习的估计器
∆ sklearn.cluster.KMeans 聚类
K-近邻算法
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 加载模块
iris = load_iris()
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集目标值、测试集目标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
# 3、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 实例化API
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
K-近邻算法
交叉验证(cross validation)
- 鸢尾花案例增加K值调优
from sklearn.model_selection import GridSearchCV
# 5、模型选择与调优——网格搜索和交叉验证
# 准备要调的超参数
param_dict = {"n_neighbors": [1, 3, 5]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
# 2)fit数据进行训练
estimator.fit(x_train, y_train)
# 5、评估模型效果
# 方法a:比对预测结果和真实值
y_predict = estimator.predict(x_test)
print("比对预测结果和真实值:\n", y_predict == y_test)
# 方法b:直接计算准确率
score = estimator.score(x_test, y_test)
print("直接计算准确率:\n", score)
- 预测facebook签到位置
# 2、基本的数据处理,拿到特征值和目标值
# 1)缩小数据范围
facebook = facebook.query("x > 1.0 & x <1.25 & y > 2.0 & y < 2.25")
# 2)选取有用的时间特征
time_value = pd.to_datetime(facebook["time"], unit="s")
time_value = pd.DatetimeIndex(time_value)
facebook["day"] = time_value.day
facebook["hour"] = time_value.hour
facebook["weekday"] = time_value.weekday
# 3)去掉签到较少的地点
place_count = facebook.groupby("place_id").count()
place_count = place_count[place_count["row_id"] > 3]
facebook = facebook[facebook["place_id"].isin(place_count.index)]
# 4、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5、KNN预估器流程
estimator = KNeighborsClassifier()
# 6、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
# 7、交叉验证和网格搜索的结果
朴素贝叶斯算法
- 20类新闻分类
# 对于文本数据,进行特征抽取
tf = TfidfVectorizer()
# estimator估计器流程
mlb = MultinomialNB(alpha=1.0)
mlb.fit(x_train, y_train)
# 进行预测
y_predict = mlb.predict(x_test)
决策树
- 泰坦尼克号乘客生存预测
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
决策树分类器
criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
max_depth:树的深度大小
random_state:随机数种子
# 进行决策树的建立和预测
# 指定树的深度大小为5
dc = DecisionTreeClassifier(criterion='entropy', max_depth=5)
dc.fit(x_train, y_train)
print("预测的准确率为:", dc.score(x_test, y_test))
随机森林
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
随机森林分类器
n_estimators:integer,optional(default = 10)森林里的树木数量120,200,300,500,800,1200
criteria:string,可选(default =“gini”)分割特征的测量方法
max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30
max_features="auto”,每个决策树的最大特征数量
If "auto", then max_features=sqrt(n_features).
If "sqrt", then max_features=sqrt(n_features) (same as "auto").
If "log2", then max_features=log2(n_features).
If None, then max_features=n_features.
bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
min_samples_split:节点划分最少样本数
min_samples_leaf:叶子节点的最小样本数
超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf
回归算法
线性回归
sklearn.linear_model.LinearRegression(fit_intercept=True)
通过正规方程优化
fit_intercept:是否计算偏置
LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置
sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型。
loss:损失类型
loss=”squared_loss”: 普通最小二乘法
fit_intercept:是否计算偏置
learning_rate : string, optional
学习率填充
'constant': eta = eta0
'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
'invscaling': eta = eta0 / pow(t, power_t)
power_t=0.25:存在父类当中
对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率。
SGDRegressor.coef_:回归系数
SGDRegressor.intercept_:偏置
欠拟合与过拟合
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
岭回归
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
具有l2正则化的线性回归
alpha:正则化力度,也叫 λ
λ取值:0~1 1~10
solver:会根据数据自动选择优化方法
sag:如果数据集、特征都比较大,选择该随机梯度下降优化
normalize:数据是否进行标准化
normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
Ridge.coef_:回归权重
Ridge.intercept_:回归偏置
逻辑回归与二分类
逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。
解决问题:广告点击率、是否为垃圾邮件、是否患病、金融诈骗、虚假账号
sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
sag:根据数据集自动选择,随机平均梯度下降
penalty:正则化的种类
C:正则化力度
模型保存和加载
1. sklearn模型的保存和加载API
from sklearn.externals import joblib
保存:joblib.dump(rf, 'test.pkl')
加载:estimator = joblib.load('test.pkl')
2. 保存
# 使用线性模型进行预测
# 使用正规方程求解
lr = LinearRegression()
# 此时在干什么?
lr.fit(x_train, y_train)
# 保存训练完结束的模型
joblib.dump(lr, "test.pkl")
3. 加载
# 通过已有的模型去预测房价
model = joblib.load("test.pkl")
print("从文件加载进来的模型预测房价的结果:", std_y.inverse_transform(model.predict(x_test)))
无监督学习-K-means算法
聚类: K-means(K均值聚类)
降维: PCA
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
k-means聚类
n_clusters:开始的聚类中心数量
init:初始化方法,默认为'k-means ++’
labels_:默认标记的类型,可以和真实值比较(不是值比较)
K-means聚类步骤
1、随机设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
网友评论