# -*- coding: utf-8 -*-
import csv
from random import seed
from random import randrange
#from math import sqrt
import pandas as pd
#import numpy as np
import pylab as pl
import itertools
pl.mpl.rcParams['font.sans-serif'] = ['SimHei'] # 没有这句话汉字都是⼝⼝
####构建数据集
dataset=pd.read_csv(r'C:\Users\86188\Desktop\data\Train.csv')
mirna_seqdf=pd.read_csv(r'C:\Users\86188\Desktop\data\mirna_seq.csv')#(['mirna', 'seq']
gene_seqdf=pd.read_csv(r'C:\Users\86188\Desktop\data\gene_seq.csv')#'label', 'sequence'
dataset_mirna=dataset['miRNA']#train获取表格中为miRNA的值
dataset_gene=dataset['gene']#train获取表格中为gene的值
dataset_label=dataset['label']#train获取表格中为label的值
gene_index=gene_seqdf['label'].values.tolist()#获取列表中的值,除去编号
gene_seq=gene_seqdf['sequence']#获取gene里的基因型)
mirna_index=mirna_seqdf['mirna'].values.tolist()#获取mirna中的名称
mirna_seq=mirna_seqdf['seq']#获取mirna中的基因型
key_set={}
key_set_T={}
for i in itertools.product('UCGA', repeat =3):#itertools.product('BCDEF', repeat = 2):#itertools.product获取数据的笛卡尔积,
obj=''.join(i)
ky={'{}'.format(obj):0}#输出{format(obj):0}
key_set.update(ky)#将{format(obj):0}键-值对添加到字典d中
for i in itertools.product('TCGA', repeat =3):#itertools.product('BCDEF', repeat = 2):
obj=''.join(i)
ky={'{}'.format(obj):0}
key_set_T.update(ky)
def clean_key_set(key_set):#清除数据,将key值变为0
for i,key in enumerate(key_set):#enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值
key_set[key]=0
return key_set
def return_features(n,seq):#返回特征值
clean_key_set(key_set)#清除key值,将key值变成0
key=key_set
if '\n' in seq:#数据存在噪声,除去\n
seq=seq[0:-1]
for i in range(n,len(seq)+1-n):
win=seq[i:i+n]
ori=key_set['{}'.format(win)]#判断是否在片段基因是否在key_set中,即获取key_set中获取key值
key_set['{}'.format(win)]=ori+1#记录遍历过的基因片段
return key_set
def return_gene_features(n,seq):#返回特征值
clean_key_set(key_set_T)
key=key_set_T
if '\n' in seq:
seq=seq[0:-1]
for i in range(n,len(seq)+1-n):
win=seq[i:i+n]
ori=key_set_T['{}'.format(win)]
key_set_T['{}'.format(win)]=ori+1
return key_set_T
def construct_dataset(dataset_mirna,dataset_gene):#使用拼接方法构建数据集
list_mirna_feature=[]
list_gene_feature=[]
for i in range(0,len(dataset_mirna)):
try:
mirna=dataset_mirna[i]#获取测试集第一个数据
m_index=mirna_index.index(mirna)#在mirna中找到该数据对应的索引
mirna_f=return_features(3,mirna_seq[m_index]) #找到该数据对应的基因型。并对特征值进行计算
gene=dataset_gene[i]#获取测试的第一个gene数据
g_index=gene_index.index(gene)#获取第一个数据在geneindex中的索引
gene_f=return_gene_features(3, gene_seq[g_index])#获取该数据对应的基因型,并对特征值进行计算
mirna_feature=mirna_f.copy()#复制一个数组
gene_feature=gene_f.copy()
list_mirna_feature.append(mirna_feature)#将mirna的特征数组加入到list_mirna_feature数组中
list_gene_feature.append(gene_feature)
except:
mirna=dataset_mirna[i]
gene=dataset_gene[i]
print('error detected',i,mirna,gene)
lmpd=pd.DataFrame(list_mirna_feature)#转化为表格,获取出现次数之和
lgpd=pd.DataFrame(list_gene_feature)
X=pd.concat([lmpd,lgpd],axis=1)#将表格合并,数据进行拼接
return X
#标签换为数字
Y=[]
for i,label in enumerate(dataset_label):
if label =='Functional MTI':
Y.append(1)
else:
Y.append(0)
X=construct_dataset(dataset_mirna,dataset_gene)
a=Y
X['匹配']=a
outputpath='C:/Users/86188/Desktop/data1/DataFrame.csv'
X.to_csv(outputpath,sep=',',index=False,header=True)
##随机森林算法 ##
def loadCSV(filename):#加载数据,一行行的存入列表
dataSet = []
with open(filename, 'r') as file:
csvReader = csv.reader(file)
for line in csvReader:
dataSet.append(line)
return dataSet[1:]
# 除了标签列,其他列都转换为float类型
def column_to_float(dataSet):
featLen = len(dataSet[0]) - 1
for data in dataSet:
for column in range(featLen):
data[column] = float(data[column].strip())#strip()函数,将其他的字符去掉,保证数据的干净
# 将数据集随机分成N块,方便交叉验证,其中一块是测试集,其他四块是训练集
#构建一个三维数组,第一维表示训练集和测试集的个数,第二维表示新数据集中导入数据的个数,第三维即表示数据。
def spiltDataSet(dataSet, n_folds):
fold_size = int(len(dataSet) / n_folds)#获取每一个数据集的长度
print("fold_size",fold_size)
#dataSet_copy = list(dataSet)
dataSet_copy = dataSet
dataSet_spilt = []
for i in range(n_folds):
fold = []
while len(fold) < fold_size: # 这里不能用if,if只是在第一次判断时起作用,while执行循环,直到条件不成立
index = randrange(len(dataSet_copy))
fold.append(dataSet_copy.pop(index)) # pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
dataSet_spilt.append(fold)
return dataSet_spilt
# 构造数据子集,使用随机分块的数据进行训练
def get_subsample(dataSet, ratio):#radio的值为1.0,
subdataSet = []
#print("len(dataSet)",len(dataSet))
#print("len(dataSet) * ratio",len(dataSet) * ratio)
lenSubdata = round(len(dataSet) * ratio)#返回浮点数,round函数:四舍五入的功能
#print("lenSubdata",lenSubdata)
while len(subdataSet) < lenSubdata:
index = randrange(len(dataSet) - 1)
subdataSet.append(dataSet[index])
return subdataSet#f返回一个新的的数据集
# 分割数据集
def data_spilt(dataSet, index, value):#输入训练集 随机特征值的下标 随机下标对应每一行中的值
left = []
right = []
for row in dataSet:
if row[index] < value:
#如果这一行的对应下标的值小于传入随机获取的下标的值,这一行放入left,否则放入right
left.append(row)
else:
right.append(row)
return left, right#返回left与right值
# 计算分割代价
def spilt_loss(left, right, class_values):
loss = 0.0
for class_value in class_values:#第一次取0
left_size = len(left)
if left_size != 0: # 防止除数为零
prop = [row[-1] for row in left].count(class_value) / float(left_size)
#prop为获取为0的数目占总left数据的比值
loss += (prop * (1.0 - prop))#若占比为1,即loss为0,若占比为0.5,即loss为0.25
right_size = len(right)
if right_size != 0:
prop = [row[-1] for row in right].count(class_value) / float(right_size)
loss += (prop * (1.0 - prop))
#计算right的那边的值,取值最大的情况就是两边都相等,两边的标签都是一样的,即损失值为0,同时可以确定这是最小的损失的特征值
return loss
# 选取任意的n个特征,在这n个特征中,选取分割时的最优特征
def get_best_spilt(dataSet, n_features):
features = []
#print("set(row[-1] for row in dat
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
<项目介绍> 基于序列的miRNA和gene的关系预测源码+数据集+模型(机器学习课程设计).zip 该资源内项目源码是个人的课设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 机器学习的课程设计,基于序列的miRNA和gene的关系预测 数据集大于25MB,无法正常上传,所以使用了压缩包的形式 对于两个底层实现代码,前一个无法正常实现,代码理解的不够透彻,第二个使用了库中的决策树,实现了基本功能,但是在对数据的预测的精确度上没有保障
资源推荐
资源详情
资源评论
收起资源包目录
基于序列的miRNA和gene的关系预测源码+数据集+模型(机器学习课程设计).zip (11个子文件)
项目说明.md 372B
基于序列micro RNA和gene的关系预测.py 7KB
data.zip 7.87MB
data
model
train_model.m 721KB
mirna_seq.csv 108KB
submit_example.csv 68B
test_dataset.csv 4KB
Train.csv 27KB
gene_seq.csv 26.67MB
随机森林算法底层02.py 7KB
随机森林算法底层01.py 15KB
共 11 条
- 1
资源评论
Make程序设计
- 粉丝: 6674
- 资源: 3576
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功