前置准备
详情请见我的上一篇博客
基本分类模型
K近邻分类器(KNN)
- 主要参数:
- 使用方法:
决策树
- 主要参数:
- 使用方法:
朴素贝叶斯
- 主要参数:
- 使用方法:
人体运动状态信息评级
实现机理
注:程序所需数据文件点此下载(提取码:BigG)
效果图
源代码
#人体运动状态信息评级.py
import numpy as np
import pandas as pd
import time
from sklearn.impute import SimpleImputer as Imputer #预处理模块
from sklearn.model_selection import train_test_split #自动生成训练集和测试集模块
from sklearn.metrics import classification_report #预测结果评估模块
from sklearn.neighbors import KNeighborsClassifier #K近邻分类器
from sklearn.tree import DecisionTreeClassifier #决策树分类器
from sklearn.naive_bayes import GaussianNB #高斯朴素贝叶斯函数
def load_dataset(feature_paths, label_paths): #读取特征文件列表和标签文件列表的内容,归并后返回
feature = np.ndarray(shape=(0, 41)) #列数量和特征维度为41
label = np.ndarray(shape=(0, 1)) #列数量和标签维度为1
for file in feature_paths:
df = pd.read_table(file, delimiter=',', na_values='?', header=None) #使用逗号为分隔符读取特征数据,将问号替换标记为缺失值,文件内不含表头
imp = Imputer(missing_values=np.nan, strategy="mean") #使用平均值补全缺失值,然后将数据进行补全
imp.fit(df) #训练预处理器
df = imp.transform(df) #生成预处理结果
feature = np.concatenate((feature, df)) #将新的数据合并到特征集合中
for file in label_paths:
df = pd.read_table(file, header=None) #读取标签数据,文件中不包含表头
label = np.concatenate((label, df)) #将新读入的数据合并到标签集合中
label = np.ravel(label) #标签规整为一维向量
return feature, label
def main():
feature_paths = ['人体运动状态信息评级数据/A.feature',
'人体运动状态信息评级数据/B.feature',
'人体运动状态信息评级数据/C.feature',
'人体运动状态信息评级数据/D.feature',
'人体运动状态信息评级数据/E.feature'] #特征文件路径
label_paths = ['人体运动状态信息评级数据/A.label',
'人体运动状态信息评级数据/B.label',
'人体运动状态信息评级数据/C.label',
'人体运动状态信息评级数据/D.label',
'人体运动状态信息评级数据/E.label'] #标签文件路径
X_train, y_train = load_dataset(feature_paths[:4], label_paths[:4]) #前四个数据作为训练集
x_test, y_test = load_dataset(feature_paths[4:], label_paths[4:]) #最后一个数据作为测试集
X_train, x_, y_train, y_ = train_test_split(X_train, y_train, test_size=0.1) #使用全量数据作为训练集,split函数打乱训练集
knn_start = time.perf_counter()
#创建K近邻分类器,并在测试集上进行预测
print("Start training knn")
knn = KNeighborsClassifier().fit(X_train, y_train)
print("Training done!")
answer_knn = knn.predict(x_test) #得到分类结果
print("Prediction done!")
print("knn 用时:{:.2f}".format(time.perf_counter() - knn_start))
dt_start = time.perf_counter()
#创建决策树分类器,并在测试集上进行预测
print("Start training DT")
dt = DecisionTreeClassifier().fit(X_train, y_train)
print("Training done!")
answer_dt = dt.predict(x_test) #得到分类结果
print("Prediction done!")
print("dt 用时:{:.2f}".format(time.perf_counter() - dt_start))
gnb_start = time.perf_counter()
#创建贝叶斯分类器,并在测试集上进行预测
print("Start training Bayes")
gnb = GaussianNB().fit(X_train, y_train)
print("Training done!")
answer_gnb = gnb.predict(x_test) #得到分类结果
print("Prediction done!")
print("gnb 用时:{:.2f}".format(time.perf_counter() - gnb_start))
#计算准确率和召回率
print("\n\nThe classification report for knn:")
print(classification_report(y_test, answer_knn))
print("\n\nThe classification report for dt:")
print(classification_report(y_test, answer_dt))
print("\n\nThe classification report for gnb:")
print(classification_report(y_test, answer_gnb))
main()
上证指数涨跌预测
实现机理
注:程序所需数据文件点此下载(提取码:BigG)
根据网易财经上获得的上证指数的历史数据,爬取的20年的上证指数数据,给出当前时间前150天的历史数据,预测当天上证指数的涨跌。
效果图
源代码
#上证指数涨跌预测.py
import pandas as pd
import numpy as np
from sklearn import svm
from sklearn import model_selection
data = pd.read_csv('上证指数涨跌预测数据.csv', encoding='gbk', parse_dates=[0], index_col=0)
data.sort_index(0, ascending=True, inplace=True)
dayfeature = 150 #选取150天数据
featurenum = 5 * dayfeature #选取的5个特征*天数
x = np.zeros((data.shape[0] - dayfeature, featurenum + 1)) #记录150天的5个特征值
y = np.zeros((data.shape[0] - dayfeature)) #记录涨或者跌
for i in range(0, data.shape[0] - dayfeature):
x[i, 0:featurenum] = np.array(data[i:i + dayfeature][[u'收盘价', u'最高价', u'最低价', u'开盘价', u'成交量']]).reshape((1, featurenum)) #将数据中的四种存入数组中
x[i, featurenum] = data.iloc[i + dayfeature][u'开盘价'] #最后一列记录当日开盘价
for i in range(0, data.shape[0] - dayfeature):
if data.iloc[i + dayfeature][u'收盘价'] >= data.iloc[i + dayfeature][u'开盘价']:
y[i] = 1 #涨
else:
y[i] = 0 #跌
clf = svm.SVC(kernel='rbf') #调用svm函数,设置kernel参数,默认为rbf
result = []
for i in range(5):
x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.2) #x和y的验证集和测试集,切分80-20%的测试集
clf.fit(x_train, y_train) #训练数据进行训练
result.append(np.mean(y_test == clf.predict(x_test))) #将预测数据和测试集的验证数据进行比对
print("svm classifier accuacy:")
print(result)
注:本文是博主机器学习课程的心得总结,不支持任何商用且不支持转载!如果你也对机器学习有一定的兴趣和理解,欢迎随时找博主交流~