We're sorry but this page doesn't work properly without JavaScript enabled. Please enable it to continue.
Feedback

Simplifying Machine Learning with nuML

00:00

Formal Metadata

Title
Simplifying Machine Learning with nuML
Alternative Title
Getting Started with nuML, an Open Source .NET Machine Learning Library
Title of Series
Number of Parts
133
Author
License
CC Attribution - NonCommercial - ShareAlike 3.0 Unported:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal and non-commercial purpose as long as the work is attributed to the author in the manner specified by the author or licensor and the work or content is shared also in adapted form only under the conditions of this
Identifiers
Publisher
Release Date
Language

Content Metadata

Subject Area
Genre
Abstract
In this session we will take a magical tour through a Machine Learning OSS framework in .NET. We'll discuss both supervised and unsupervised learning problems through practical code examples in order to equip you with the tools you will need to get started with machine learning in your own projects. We will also discuss ways to extend the framework in order to include the various machine learning algorithms of your own design.
Software developerMachine learningRight angleLibrary (computing)Virtual machineOnline helpCASE <Informatik>QuicksortGoodness of fitGroup actionJSONXMLUMLComputer animation
Machine learningCategory of beingEndliche ModelltheorieMathematicsSoftware developerPhysical systemPredictionData structureVirtual machineUnsupervised learningSoftware developerMagnetic stripe cardPixelMachine learningComputer-assisted translationAlgorithmMereologyFormal languageLibrary (computing)NeuroinformatikGame controllerSeries (mathematics)Slide ruleQuicksortDependent and independent variables1 (number)Goodness of fitProgrammer (hardware)Flow separationPoint (geometry)Right angleCASE <Informatik>Medical imagingWebsiteProduct (business)Revision controlDecision tree learningMathematicsLatent heatWritingData storage deviceComputer programmingData structureGreatest elementMultiplication signBitComputer animation
PredictionData structureSoftware developerInclusion mapLinear regressionGradientSocial classStudent's t-testMathematicsSinguläres IntegralData modelDean numberVirtual machineGroup actionFigurate numberFocus (optics)NumberLinear regressionAreaBitDomain nameNeuroinformatikUnsupervised learningAverageInferenceSquare numberMathematicsDecision tree learningDatabaseProduct (business)Selectivity (electronic)CollaborationismFacebookData structureEndliche ModelltheorieSupervised learningAlgorithmGoodness of fitProcess (computing)Finite setLinear algebraMachine learning2 (number)CASE <Informatik>Bit rateMultiplicationSocial classMultiplication signSimilarity (geometry)Phase transitionCollaborative filteringLink (knot theory)Latent heatRight angleSystem callWeb pageComputer animation
Software developerPoint cloudLinear mapAlgebraAlgorithmNetwork topologyMachine learningVirtual machinePredictabilityThresholding (image processing)Hecke operatorRepresentation (politics)Term (mathematics)Row (database)Decision theoryMultiplication signWage labourArtificial neural networkSet (mathematics)Boundary value problemLinear regressionFunctional (mathematics)Vector spaceDatabaseLibrary (computing)Staff (military)NeuroinformatikRule of inferenceComputer scienceTurtle graphicsRight angleEndliche ModelltheorieMatching (graph theory)Social classQuicksortMathematicsProduct (business)40 (number)Computer animation
Software developerCASE <Informatik>Endliche ModelltheorieSoftwareLibrary (computing)Group actionVirtual machineQuicksortMultiplication signDecision theoryNetwork topologyDomain nameWeightLaptopComputer animationLecture/ConferenceXMLJSON
Singuläres IntegralDean numberSoftware developerMathematicsCategory of beingIRIS-TClique-widthLengthSocial classMatrix (mathematics)Vector spaceEndliche ModelltheorieData modelPredictionDecision theoryEndliche ModelltheorieLaptopCategory of beingSoftware testingProcess (computing)WeightNetwork topologyTable (information)NetzwerkdatenbanksystemRight angleData dictionaryVirtual machineDeclarative programmingGame controllerInterface (computing)Unit testingMathematicsExtension (kinesiology)Support vector machineMultiplication signData typeTransformation (genetics)Type theoryQuicksortObject (grammar)Social classNeuroinformatikClosed setMachine learningLink (knot theory)Set (mathematics)Vector spaceSquare numberRead-only memoryElectronic mailing listData conversionArtificial neural networkPredictabilityWindowState of matterSimilarity (geometry)AverageHypermediaRange (statistics)Poisson-KlammerDot productQuantum stateDivisorLengthElectric generatorRule of inferenceDescriptive statisticsSystem callReading (process)Scripting languageProjective planeService (economics)InternetworkingDynamical systemComputer animationLecture/Conference
Software developerRevision controlImage resolutionMetropolitan area networkHecke operatorComputer animationLecture/Conference
Software developerRevision controlFigurate numberVideoconferencingComputer fileMultiplication signFlash memoryVirtual machineWordGame controllerMetropolitan area networkPhysical systemComputer animation
Revision controlSoftware developerSpacetimeMathematicsVideo game consoleMusical ensembleUtility softwareWeightElectric currentExtension (kinesiology)Data modelCodeComputer programmingComputer fontGoodness of fitComputer animationLecture/Conference
Revision controlSoftware developerVideo game consoleMusical ensembleMathematicsStudent's t-testData modelExecution unitPredictionSoftware testingBit rateAvatar (2009 film)ImplementationGoodness of fitGame controllerRight angleMathematicsEndliche ModelltheorieDot productType theorySet (mathematics)Computer programmingMatrix (mathematics)Point (geometry)Scripting languageProcess (computing)Message passingMeasurementLine (geometry)CASE <Informatik>Multiplication sign1 (number)Computer fileMultilaterationVector spaceTupleElectric generatorComputer animationLecture/Conference
Revision controlSoftware developerPhysical systemReflection (mathematics)Concurrency (computer science)Run time (program lifecycle phase)Beta functionUnsupervised learningMachine learningMathematicsCore dumpWeightWebsite2 (number)Right angleCore dumpWeightCuboidProjective planeSource codeReading (process)Multiplication signComputer animationSource code
Software developerMachine codeRun time (program lifecycle phase)Core dumpBeta functionData typeReflection (mathematics)Extension (kinesiology)Physical systemInstallation artComputer fileRevision controlString (computer science)Stack (abstract data type)ArchitectureException handlingService (economics)Software frameworkDefault (computer science)Computer programMetropolitan area networkSlide ruleNetwork topologyLibrary (computing)Endliche ModelltheorieFlow separationVector spaceData modelDecision theoryRevision controlGraph coloringArtificial neural networkVirtual machineImplementationSource codeComputer animation
Run time (program lifecycle phase)Addressing modePhysical systemReflection (mathematics)SynchronizationBeta functionElectric currentSoftware frameworkCompilation albumRevision controlData typeArchitectureConfiguration spaceDirectory serviceDefault (computer science)Cartesian coordinate systemSoftware developerContext awarenessStack (abstract data type)Computer programException handlingService (economics)String (computer science)Programmable read-only memoryComputer fileTablet computerVideo game consoleExistenceGame controllerBitCore dumpShift operatorWeightKeyboard shortcutRoundness (object)Projective planeWindowNetwork topologySource codeComputer animation
ExistenceVideo game consolePhysical systemSoftware developerNumbering schemeExecution unitVirtual machineWebsiteCartesian coordinate systemProjective planeVideo game consoleSystem callComputer programmingProgrammer (hardware)MathematicsClient (computing)Source codeComputer animation
Student's t-testSoftware developerWeb pageVirtual machineDisk read-and-write headGame controllerSocial classComputer animation
Video game consoleSoftware testingPhysical systemMathematicsSpacetimeTerm (mathematics)Execution unitCuboidWordRight angleGame controllerMathematicsVideo game consoleCategory of beingDemo (music)Installation artSoftware testingShift operator2 (number)Reading (process)Virtual machineGreatest elementMultiplication signAxiom of choiceSource codeXMLComputer animation
Software developerChi-squared distributionVirtual machineDegree (graph theory)Demo (music)Metropolitan area networkCuboidData storage deviceComputer animationLecture/Conference
Software developerLibrary (computing)Revision control2 (number)Computer fontBoom (sailing)Endliche ModelltheorieWeightNeuroinformatikProjective planeBackupBitMultiplication signComputer animationLecture/Conference
Software developerData modelComputer programVisual systemVideo game consoleSigma-algebraPredictionSoftware testingProjective planeLimit (category theory)Sampling (statistics)Data storage deviceCodeVideo game consoleRight angleWindowWeb 2.0CausalityComputer animationSource code
MathematicsSoftware testingPredictionMenu (computing)Software developerVisual systemComputer programVideo game consoleMobile appDirectory serviceBookmark (World Wide Web)Coma BerenicesPhysical systemStudent's t-testGradientRepresentation (politics)Cartesian coordinate systemVideo game consoleNumeral (linguistics)Game controllerRun time (program lifecycle phase)Computer programmingBeta functionProjective planeRight angleSource codeComputer animationLecture/Conference
Computer fileVideo game consoleComputer programDemo (music)Software developerProgrammer (hardware)Menu (computing)MathematicsRepresentation (politics)Letterpress printingRing (mathematics)WordGame controllerString (computer science)NumberScripting languageControl flowCategory of beingRight angleDecision theoryMultiplication signMathematicsSource codeComputer animation
Term (mathematics)Coma BerenicesVideo game consoleVisual systemComputer programData modelMiniDiscSoftware developerMathematicsRepresentation (politics)Maxima and minimaCAN busInclusion mapMenu (computing)PredictionDecision theoryCausalityComputer fileDemo (music)Dew pointAbstractionSet (mathematics)Convex hullClique-widthUser-generated contentMoment of inertiaTask (computing)Error messageException handlingRun time (program lifecycle phase)Physical systemService (economics)CompilerStack (abstract data type)Matrix (mathematics)Right angleGame controllerDecision theoryEndliche ModelltheorieDivisorNetwork topologyMultiplication signWindowSocial classLine (geometry)VarianceType theoryComputer fileInterface (computing)Projective planeError messageInheritance (object-oriented programming)PredictabilityQuicksortTouchscreenCategory of beingImplementationMereologyDifferent (Kate Ryan album)MathematicsTouch typingDoubling the cubeBoom (sailing)Lipschitz-StetigkeitOperator (mathematics)WordDeclarative programmingFunction (mathematics)Message passingPhysical systemWave packetProduct (business)Electric generatorBitData storage deviceResultantRoundness (object)Data miningSource codeComputer animation
Menu (computing)Visual systemSoftware developerComputer fileElectric generatorSpacetimeError messageRevision controlMatrix (mathematics)Data modelContext awarenessGeneric programmingExtension (kinesiology)Parameter (computer programming)Vector spaceComputer programTask (computing)Exception handlingStack (abstract data type)CompilerRun time (program lifecycle phase)Physical systemService (economics)ArchitectureBeta functionCore dumpDefault (computer science)Video game consoleMassNamespaceGoodness of fitStreaming mediaWeb pageRight angleWindowDefault (computer science)WhiteboardCategory of beingLibrary (computing)Web browserEndliche ModelltheorieLaptopFreewareTouchscreenSource code
GoogolMenu (computing)Software developerWebsiteGraphical user interfaceMachine learningUnsupervised learningVirtual machineTelephone number mappingPermianTerm (mathematics)Software frameworkFunction (mathematics)MathematicsKernel (computing)Database normalizationAlgebraSocial classSpacetimeLine (geometry)Execution unitFluid staticsMatrix (mathematics)RAIDPredictionDefault (computer science)Interface (computing)ECosSource codeView (database)Demo (music)Social classRight angleMultiplication signVirtual machineProcess (computing)QuicksortInformationVarianceCellular automatonEndliche ModelltheorieFamilyWeightMultiplicationPredictabilityGoodness of fitSoftwareLinear algebraNumberFunctional (mathematics)ImplementationLevel (video gaming)Program slicingMathematicianSubject indexingMoving averageComputer clusterLoginMixture modelSet (mathematics)AutocovarianceInterior (topology)Computer animationSource code
Transcript: English(auto-generated)
So we're going to talk about machine learning. I wrote a library called NewML in conjunction with some help with someone from Australia. So we're both working on this. And this is supposed to simplify machine learning. The problem with machine learning is that it has sort of like a bad reputation.
You know what I'm saying? A lot of the travesties in human history have all occurred in the name of machine learning. And so what I'm hoping to do is I'm hoping to simplify sort of the basic use cases of machine learning. And if you are a professional machine learning person,
that's good. If I say anything wrong, just raise your hand and then we'll defer to you because after all, we're in the UK and your accents make you smarter than me anyways. So I'm pretty excited about that. All right, so this is what we're going to talk about. We're going to do a little overview of how I think about machine learning and how that inspired machine learning in my particular library.
And then we're going to talk about sort of some other things on how this stuff works. I think I only have how long? These are 50 minutes? An hour, OK. This is the last session, right? So I can take as long as I want is what we decided, right? As long as it's entertaining. Don't forget to vote on the way out. So let's go into what machine learning is.
And I'm going to start instead of, because y'all can read slides while I say stuff. So machine learning is an interesting thing because it changes the way we think about writing programs. And let me start with an anecdote. Is anyone named Jim or Phil in here? Because Jim is going to get picked on, if whoever's Jim
is. Oh, if there's a Jim back here, we should use Phil instead, right? No Phil's, so we're going to use Phil. So any of you work at a bank? None of you, so you're happy devs, right? So the thing about, let's pretend that Sue is a developer and she works at a bank, a very small bank.
And the owner of the bank is just like, OK, we need to have a new thing where people can put their checks in to the teller machine and it will scan them and then put money in. We have those now, right? So imagine that you're a very poor bank and the only checks you issue have a black stripe at the top.
It's the pure black stripe. Is that a hard algorithm to write? Not really, right? You scan the check, you have an image, right? You just check if there's a black stripe at the top, and if there isn't, you flip. So Sue's like, yeah, that'd take me about a half hour.
I'll add 15 minutes just to be safe, 45 minutes. And sure enough, Sue gets all the images, she checks the check, she makes a really good algorithm, if black stripe at bottom, flip, done, 30 minutes. And so Phil, who's the marketing guy, is like, wow, we can do this check thing.
I think we should do something really special for the owner, Joe, because Joe really loves his cat. Because everyone who has a cat, they just love their cat. And how about, would it be hard if we put just, and this is Phil, everyone has a Phil at their work. It's just this one thing, right? We just need to add this one thing, it's easy, right?
And the other thing only took you a half hour. So this should take what, 15 minutes? So we want you to make sure that the owner is gonna have a picture of their cat, and they're gonna scan the check in, and you gotta check if the cat is upside down. Is that hard to do?
It's a little harder, but they give you the picture of the cat. Is it as hard? You know, not as bad. Not as bad, right, because you have this one check, and you know about the cat, and so you say if black stripe at bottom, else if cat upside down flip. I don't know what language this is, but it understands stripes and cats, right?
And so now that you've actually done this, Phil, he's like, you know, the owner loves that they can use this new check. We just wanna add this one thing. We want anybody to add any picture to their check. And your flipping algorithm needs to work.
And that's when Sue decides to not work in banking. Right? Have you had algorithms where the requirements change, and you're making some kind of funny tweak, right? Like you're going in there, and you're like, if I change .8 to .9, the algorithm works a little bit better,
and then you gotta go home and take a shower afterwards. You know what I'm saying? The kind of programming I'm talking about, where you feel like you need to take a shower. We've all done this. We've all done these algorithms that we were incessantly going in there and tweaking, because we were trained as programmers to take a problem and create a series of steps to solve that problem.
That's how we were trained. Machine learning is the opposite. Instead of giving the computer a series of steps to answer a question, we're gonna give the computer examples of the right thing and let it figure it out. That's machine learning.
And it feels like, as a programmer, we're giving up control. I like to think of it as delegation, right? Because we're still in charge, delegation. We're gonna delegate that responsibility to the computer.
The main thing about machine learning, and my advisor told me this every time, is about generalizing, right? You wanna generalize. Okay, I think I said all of this in a longer way, right? Yes. Okay, so this is a good separation of machine learning that helps me understand it.
There's supervised learning and unsupervised learning. Supervised learning is where you wanna learn a specific thing. An example is that of the check. Is it upside down or not? So in this example, in this use case, in this part of your case, you would give the computer all the checks, and you would tell it which ones are upside down
and which ones aren't, right? You see that? So now you're giving the computer examples instead of trying to figure out where the pixels are. You see what I'm saying? That's what you're doing. That's supervised learning because you're learning a specific thing, yes or no. Unsupervised learning is where you're trying to learn
about the structure of your data. Does that make sense? Here's an example. Say you have an online shop, and someone adds a product to their cart. How do we know what to suggest? Right, how do you know the kind of stuff you like? Well, you look at the stuff you've already liked, and you're like, I like stuff that's like that.
So how do you know things are like each other? Well, you use something in unsupervised learning called clustering or grouping that will tell you, as soon as you add this product to your cart, there are five others that are similar to it, but how do you measure similarity? That's the unsupervised learning problem, among other things, right?
That's how I like to think about it. Now, another even better way to do it is how do you know that you will like something in the future? Who do you ask? Your mom, no, your friends, sorry, I got that back. Your friends, right? If your friends say, hey, I really like this thing, and your friends are like you, and they rate something very high,
then likely you would like that too. That's called collaborative filtering, and it also requires clustering. It also requires you to use unsupervised learning methodologies. Does that make sense? And we have these machine learning algorithms that we sit there and just feed constantly, right? If you wanna screw up your friends, like everything on your Facebook page, click on every link,
because then you'll hose them too, right? The computer will be like, hey, you're like Seth. You'll like all these things too. Why am I getting all these weird ads? That's why. Does that make sense? And so that's an example of unsupervised learning, right? Supervised learning, you're learning a specific target. Unsupervised learning, you're trying to learn about the structure of your data
to make inferences about your data, okay? So we're only gonna focus on the supervised learning problem for new ML, just because I think it's pretty standard. The unsupervised learning problem, you get these groups of things, and then you have to decide what to do, and I think this one's a little bit easier to generalize, in my opinion. Others might disagree, and that's okay. So these are three areas of classification.
I think they're the only three. There might be more, I don't know. Regression is when you're trying to learn any number. Can you give me an example of a regression problem? You're trying to learn a number from something.
Average market price of a house, right? Yeah, you're trying to guess for next month. You see what I'm saying? You're trying to use the past to predict a number for something in the future. And before any of you come up to me afterwards and have this really good use case for machine learning to make a lot of money on the stock market,
they're doing that already. And I'm not very good at that kind of math. Okay, the second is, the second that's easy to understand is multiclass classification, where you're trying to learn to decide between a finite set of things. It's a classification problem, but you have a finite set.
And then the first one is binary classification, where you're trying to learn yes and no. I'm gonna ignore the regression problem in this case, if that's okay, but it's similar. And the models work, right? And I'm gonna look at these two for a second. Just ignore this for a second. Let's suppose that I can make one of these,
a binary classifier. How can I make one of these out of one of those? I used to teach primary school or high school, and so awkward silence is only awkward for you.
I don't care. Yes sir? Very good. He's saying yes, no for all of them, and then whichever one scores the highest is the best one. That's called a one versus all. You're saying are you A or something else? B or something else? That's one of the smarter ways to do it.
You can also decide between A and B, A and C, A and D, A and F. B and C, that's called an all versus all classifier. But what you're doing is you're taking a binary classifier and you're pushing it into a multiclass classifier by making a lot of them. Does that make sense?
Any questions about that? Okay. So here is the machine learning process as I see it. You always start with your data. And for us, let's just assume it's a square. You know anybody square. You ever go into your database and you do select star from blah,
there's a big square of data that comes out. That's what your data is. The challenge though with data science and machine learning is this number two step. You have to clean it, you have to transform it, and you have to put it into math. Once you've done that, then you can generate some models using whatever fun linear algebra technique that you have
or any machine learning model that you have. You use the maths because, and I still haven't figured out this yet, apparently everywhere else in the world they have maths and in the U.S. we have only one. I'm still trying to figure out where the delta is, what extra special secret maths you all learned.
We'll figure that out later. So generate model. And then once you have a model, use that model to predict. Does that make sense? That's how I see it. And there's a lot of, in this phase, there's a lot of voodoo witch doctory domain knowledge stuff that needs to happen. But that's all on you, right? As the data scientist.
And if you call yourself a data scientist, you get a raise too. It's really cool. So yeah. So I'm gonna go through this one more time, but a little bit more explicitly. This is your data. Let's suppose you own a tennis shop and you want to know how to staff the outer courts.
And you know over the history of things, by the way, they always use, if you ever take a machine learning class, they are gonna use this tennis data set almost every time. I don't know why. Maybe someone likes tennis. I watch it sometimes when it's late and I don't have anything else to do.
Okay, so consider these particular values. You have three, outlook, temperature, and windy. And you're trying to predict class. So in machine learning parlance, features are the things you're using to make the prediction. The label is the thing that you are predicting, yeah? That's how I understand it. The values are X. The machine learning problem is given this, right?
Which eventually is gonna become a big X, right? Because each one of these is the little X. Given a big X and a collection of Ys that match up to it, can you give me a function H that given a new X that we haven't seen, correctly predicts Y.
That's machine learning. That's supervised learning. You're trying to find this H function. Make sense? But the reality of the matter is that your data actually kinda looks like that, right? Because every freaking time you tell Jim that's not where you put the name, that's where you put the age, Jim still puts the name in the age column
and it screws everything up, right? And then people don't fill all their stuff out and then your data looks weird. And you know, Turtle Cloud, I don't know what he was thinking. Is it windy? Kind of, what does that even mean, right? But your users will find a way to put that wrong thing in your database. Have you ever looked at your database?
Oh, that's right, none of you work in banks. Yeah, that's a labor of love, that DBA, right? So that's what your data really looks like and you need to find a way to, for example, what do we do when we don't know what the outlook is? You need to tell the algorithm what to do. You need to also know that this and Overcast are the same thing.
You need to have a threshold of is it windy or not? Kind of goes to a no, 28% goes to a no. You need to come up with these rules to clean up your data and that's probably where you'll spend a lot of your time. I mean, would you, any data scientist, just where you spend, you spend a lot of your time making this better. Yeah, you spend a lot of your time.
So if you're thinking like this is like really cool, you know, you're just literally a glorified data janitor. That's what they should call them. Glorified data janitors, not, but data scientists sound so much better, right? You know what I'm saying? Okay, so then I already wrote that and then the other thing, oh, this is important to computer science here.
Have you heard the term yak shaving? That's like 80% of data science work. Yak shaving. It's like, if you don't know what I mean by that, it's like that time you go to fix a light bulb and then when you, to change the light bulb and then when you're starting to unscrew it, you realize that one of the screws is loose. So you have to go to the drawer
to pull the screwdriver out. But then when you are at the drawer, you notice it's a little squeaky. So you gotta go to the garage to get WD-40 and then your spouse yells at you because she asks you to change the light. All that other stuff is yak shaving. Changing the light is the actual work. That's what's going on here. And I put a little picture there
for those that don't know what a yak is. Okay, and then the other thing is you have to make this into math. How do I change this into numbers? I don't know. Well, there's some things that you can do. There's some things that my library does, but it assumes a lot about stuff.
Which is okay because then you can override it and change it however you like. All right, once you've done that, you gotta make a model. So looking at this, how would you predict this? Should we get more staff because people are gonna play outside or not? Sunny, low, and no. What do you think?
Why? Sunny, low, and yes. But this is sunny, low, and no. So windiness does not affect,
so sunny, low, the question, it becomes confusing, right? So you gotta come up with a way to decide. The computer will probably make this. This is a decision tree. That's one of the algorithms. Some of the algorithms are really good at giving you a representation of how it decided something. Others are notoriously bad.
The one that's notoriously angry or bad at telling you what the heck is going on in our neural networks. The one that is notoriously good is decision tree, perceptron, linear models are very good. Like if you're learning an SVM, a support vector machine, it will tell you all of the rows
that are along the boundary of the decision. So that's important. Okay, once you have this model, then you have to predict. So give it a new thing. You're like, okay, the sunny, sorry, that cut off. There's supposed to be something else. But I guess it doesn't matter in this case. If it's sunny and the temperature's low,
you should play. That's what the model tells you. Okay, any questions about that? Okay, so as with any important software, the first thing you have to do is come up with a name and a logo, and that's what we did. And we also have it in black, just in case, you know, because we want to be sure, because the black t-shirts are kind of cool too.
No, I love this logo because I told someone, because this sort of does a decision tree and grouping at the same time, and it used to be called machine learning for .NET, but someone told me that was dumb, and you know how sensitive I am, you know? And so I copied their library, which was NuGet, and I changed it to NuML.
It's just machine learning for .NET. And it also so happened that the domain name was available. Yeah, I know, I know, I squatted it. Okay, so NuML. So let's talk about how you do this in NuML. And then Mark's getting his laptop right.
Can you do .NET run and .NET restore? Oh, really? YAK shaving. That is like the epitome.
Is YAK shaving? Oh, can you do .NET restore and .NET run? I know, right? To be fair, I mean, he's on a Windows. Oh, okay. Not D-N-U, .NET, it's different.
.NET, I guess I shouldn't say, but .NET is the newest one, and it's all probably just gonna be called that. That's right. All right, so in NuML, this is how you work with stuff. The first thing you have to think about is you have to have this thing called a descriptor.
And this descriptor describes your type, because we're used to seeing squares of data, and I thought, well, maybe that's okay. So there's this descriptor that will have an array of properties that describe the features that you're using. Remember, the features are the X that you're trying to learn from,
and then the label here is the Y. So your descriptor object will have a property array called features, and then it will have a property called label, right? And the descriptor's job is to convert that into that, once you do that.
That's all you have to do, okay? Make sense? It's pretty simple. Okay, so that's what the descriptor does. So just to go back, you have the descriptor, then you have a set of properties, and then what it will do is it will convert this into that, and then give you also a Y, so an X and a Y.
But again, I'm gonna do this automatically for you. So that's good, right? Well, sure, but it might also not work. You might be describing your data incorrectly, okay? All right, so here's how you describe data in,
here's how you can make a descriptor, one way of making a descriptor is called a strong descriptor, or a strong declaration for a descriptor. You can just go onto your type, and you can mark them as feature and label, right? And the first time I made that, I was like, I understand that, right?
We have this iris, which is another data set that we always use to do machine learning. I'm gonna make these the feature, and then this the label. Makes sense? Strong declaration. Why is this, do you like this, first of all? Why is this bad, too?
What if you don't have control of the type, right? What if this is an object that you're getting from somewhere else? Can you go into their class and mark it up? No, and I found this to be an issue. So then there's this one, which is a standard declaration.
Which has kind of taken a step back, right? So you have a descriptor for the iris data type with the sepal length, the sepal width, petal length, petal width, and we're gonna learn this class. See that, very simple. So if you go back, you'll see that it's similar, right? If you have control of type, you can do that.
I would generally discourage you from cluttering up your types, to be honest, and I favor this much more. But is there a problem with this? Yeah, if you're using ADO.net, what do you get back? A data table. How do you mark that up? What if you're using an anonymous type,
because you've shaped your data in a link query? You know what an anonymous type is? A new curly bracket, blah equals blah, blah equals blah, read only types. Can you do this with that? No, you have no idea what it is. So then there is this thing called a weak declaration.
This is a weak declaration of a descriptor, which pretty much covers everything. And this, I have unit tests that test with dynamic types, that test with data tables, and that also tests with dictionaries of dictionaries. So this generally works.
That's how you describe your actual data. But now, once you have your description, what you can do is you say description.to examples, you pass in your IEnumerable of whatever it is that you have, whether it be a data table, or you pass your data table in, or you pass your IEnumerable of t,
or you pass your list of t, or whatever, whatever of t, and it will automatically make the conversion to vectors. Make sense? Okay. Is your computer on the internet? You have wireless? Okay, well, we can, I can figure it out with the NX.
Okay, it's okay. All right, so generating models. So now that you, remember, because the first step was you have your data, you have to make it into math. Notice that the descriptor object will take that. We are actually working on some stuff
in the near future that will allow you to add a pipeline of sort of handlers for when your data passes through so that you can clip the ranges, for example. Let's just say you want this thing to be between zero and 100 only. Then if there's anything that's outside of that range, we can clip. And then we can, we're also adding stuff in the pipeline that you can actually,
what do you do if there's a null in there, if you have a nullable type? If there's a null, what should I put in there? You can tell it, just put the average, or the median, or the zero, or a one, you know what I'm saying? And that's something that we're working on for later on. But notice that the extent of data cleaning that we do is we assume that it's clean. Give us your clean data, but we're working on some stuff to make it a little bit better.
And then the extent of what we do is the transformation from the math side. Okay, once we have this generate, model, and predict, there are two base interfaces. One is called an I generator. Oh, the animation went too fast.
Much better, there you go. So you have this thing called an I generator, and its job is to produce an I model, remember? Before, we saw a decision tree, that would be a decision tree model. If you wanted neural networks, you'd get a neural networks model. If you wanted a support vector machine model, you'd get an SVM model. And for each of those, you would have an I generator,
like an SVM generator, decision tree generator, neural network generator. The generator requires a descriptor and a collection of things, and it will pass out a model, and that model, all of them have a method called predict. Right, and that predict, what it will do
is it has no return type. If you pass in the T, it will attempt to fill in the value. If it's a read-only type, obviously, there's gonna be an error. So it also has a predict X, which is, if you can't do it, you use the descriptor to convert your object over to a vector, pass that vector in,
and it will give you an answer Y. This is what we think about that, okay? Make sense? Okay, so here's a reminder of everything, and now it's time to see if I can get this to work on your machine. Ready? I'm just trying to install the latest version. Do you want me to close this? Yeah, it's fine, we'll do whatever you want.
Okay, so I don't want everyone to see your bank account. I mean, that's really awkward. Do you know, there's important things to show you. Oh, is there? Okay, okay. I'm just kidding, there's nothing on there. Okay, there's nothing on there, so nothing. You're not an exciting person at all? No. All right, I'm not very exciting either, to be fair. I disagree.
Well, thank you, thank you. Well, I owe you friendship dues now. All right, here we go. Are we gonna have to go with a Linux box, man? You're a Microsoft dude, what the heck? Mark, how's it going?
There we go. That's a nice resolution. That's beautiful, so let's fix the resolution here. I know how to do that. Okay, yeah, you go. All right, I got it, I got you. Oh, I actually like this, it's much better. Just, you should minimize that just for a second, though, because I think you are an exciting person.
Oh my gosh, oh jeez. I'm embarrassed, my mum would be proud. All right, so I'm gonna download netman.io frontslash newml frontslash example.zip. Hopefully it'll download a zip file so we can see.
Did it download it already? Where's your downloads folder? I don't wanna like open your downloads folder and have like weird videos in there, man. You're right, you're opening a lot of trouble. Like he has like a weird video. There it is. Seth in a cup. Yeah, oh, I did not know that was researchable.
How did you find that? Yeah, sorry, it's not since you have free mics. Okay, so I'm gonna go folder and I'm gonna make my example here. Very good, okay. And then I'm gonna take this example here and then control C. Again, this is an example I'm running on someone else's machine, okay?
So if it doesn't work the first time, we'll figure it out. This is brand new stuff. The reason why is I spent a long time trying to get it to work on a Mac. Okay, cd and then right click. Oh, is there like a, paste.
Sorry, I'm used to, I don't use this. I don't use this one. So dnu restore, let's see if, well, first you have code running on here? Okay, code dot, good. Okay, let me show you the program.
Very good. Oh, you have a wonderful font size, my friend. It's great. What's that? Yeah, it's like you're a professional or something. Let's see if it'll restore first of all. Okay, so while it's doing that, I'll go and go over here. Okay, so obviously everything is gonna be angry
until I get stuff. So here is the, here's some code in C sharp. Oh, geez, dude, what is this? So it's, okay, right, okay, okay. So you'll see squiggly lines but pretend that it's okay with it
because it'll be okay. So, oh, I have a laser too. It's not a laser but I like to call it a laser because it's more exciting. So here is the first step. So there is a, in my data dot cs file, I have a tennis data set and you can see that right here.
You see that? All the way at the bottom, I have a bunch of data sets in here and this is just like lazy, lazy data sets. So I have, there's the tennis data set and it's marked up the way you would expect. Obviously I wouldn't, probably wouldn't do it that way but that's okay. And then I have this thing that returns a lot of them.
Okay, that's what that is. Later. Okay, so now that I have that and you've seen that, let's go back to this file so we can sort of look at what this is gonna do. So step one is the data. So I get the data and I create a descriptor for tennis.
Remember, there's three ways to do it depending on how much control you have over the type. Once you have the descriptor, then this is not really necessary but I wanted to show you that step. If you wanted to get the x and y's out to see the kinds of assumptions that I'm making, you can actually see here that the descriptor returns a tuple of x and y.
An x is a matrix, a y is a vector. Then what you do is you generate a model. Notice that in the generate model step, do you see any of the math stuff? No, it's not there because it's implicit
when you give me a descriptor and you give me the set of data, I'm gonna do those conversions for you. But again, I'm making assumptions and we're okay with that as long as you're okay with that and if you're not, I wrote it for free so it's okay anyway. You're not paying me or nothing.
Once you do that, once you generate this model, then you use this model to make prediction. And so tennis, t equals new tennis, outlook is blah, blah, blah, model.predict t and then you write whether it's going up. So here's a question for you though.
How do you know if this is doing well? Like how do you know that your model is gonna do a good job? Yeah, but how do you do that? How do you get the accuracy and the precision if we just made a model using all our data? Yeah, you actually have to separate it out.
So let's just say you have 1,000 data points that you're using or 1,000 examples. Let's just say you wanna keep 80% to make a model and you use 20% to train it. What you do then in my particular implementation is you do this thing.
You use this thing called a learner. In this case, you can see that there is this learner that will learn the tennis data set with 80% of the data and it will run it 100 times using this generator. The other cool thing is that this is a params
of iGenerator, so you can pass in as many as you want and it will do it for all of them. And so for example, when you're trying to come up with a good model, oh, someone just logged in. Should I say hi? Oh, yeah, yeah.
We should, maybe she'll message something scary. Oh, okay, good. All right, so there it is. The learner will do that and what the learner will do is it will return your accuracy. The accuracy is only one measure. There's other measures of goodness for your particular models. And Chris actually started to add tons of those stuff, like F-score, precision recall, and other ones.
I don't know, he added some other stuff. Make sense? And then obviously you can predict that. So let's see if I can get it to run. That's the first thing. So did I do a DNE restore?
Give it a second. Any questions as it's restoring right now? So far so good? Okay. It is open source and let me go to the website while it's, because it's still thinking about stuff.
So newml.net. If you go there, you can see it's right here and you can actually look at the API and the documentation is fantastic. Like take a look at this documentation right here. This is impressive.
I'm working on it. I just changed the website. So here's, for example, how to run it on .NET Core. So if you have a Linux box or a Mac, as you can read, doesn't read very well. You have this thing called, it says installing .NET Core and you can install it on Linux or Mac.
And then you can initialize this project. It shows you exactly how to do that. And then you get to write some source code on top of that. All right, let's see if it restored. Oh man, it's gonna take forever to do this. You know what I'm gonna do? I'm gonna use Visual Studio.
I don't wanna do that. Okay, so as it's restoring, let me tell you some other stuff that's in the library. So the, oh, because the slides are on here, right? Well, let me tell you some other stuff in the library. We have several models, right? The models that we have right now are,
we have decision trees, we have support vector machines, we have neural networks, we have a Perceptron implementation, naive Bayes. I added a cheap version of SVM called Kernel Perceptron. Oh, it's going good. A cheap version of Kernel Perceptron and then I have, I think that's all of them
on the supervised side. So there's a lot of them. But the idea is that you should be able to like add your own models as well. So let's see if it works. So DNX, I think it's DNX run.
Okay, and I know how to fix that. Okay, so now it's a little bit happier. So let me fix this. So this was designed to work on the .NET Core, but now I just need to, where's the shift on this? Shift, wow, your keyboards are different.
Two, DNX 4.5.1, nice. Okay, so if I go here, DNX 4.5.1, control S, and then I need to, a DNU, DNU restore,
hopefully it pulls it from cache, and then DNX run. Duh!
You know what I can do? I know what I can do. I can delete RM. How do you delete in Windows? D-E-L? D-E-L project, project.lock.json.
D-N-U restore, DNX run. Yeah, it's not gonna work on this machine.
What a bummer. What's that? I can try, yeah, let's do that.
Yeah, I can make it a Visual Studio. Let me just make it, let me make a new one here. I'm gonna make a new project, and it's gonna be a console project. Sorry about this. My machine would not. So we're gonna do Windows, and we're gonna do console application, and I'm gonna call it obviously the most, and then what I'll do is I'll just add the text to it.
Okay, so that's what I'm gonna do. So there's a program.cs. I will right-click, and I will add, I will add a new class, and we'll call it data, data, oh.
Why is it all caps? Data.cs, boom, okay. And then what I'll do is I'll just copy this stuff over. I'm sorry about this. It's just, you know, it is what it is. So I'll go up like this, all the way to the top.
Oh, there's page up. Page up. No, it doesn't work for me. Any questions? Have you guys used machine learning at all? Anyone used machine learning? Okay. So we have some people here that have used it. So far, here we go.
So public class data, control V, okay, and then I need to add a NuGet package to hopefully this will work too.
There it is, pre-release. Hopefully that works. And again, if it doesn't, maybe we can all gather on my laptop and get the heat off my head to warm us up, you know what I'm saying?
So it'll download this, and then let me go to the other side while it's downloading. Let's go shift and up. And then if not, then maybe Mark will get his to work, which would be funny, right? The Microsoft guy had to use a Linux box
to get his stuff to work. I think I already have that.
And so we just need to wait for the package to download. So we'll give it a second. And then these properties should work. Okay. Are you guys all from this area?
No, me neither. I accept. I've never had to accept my own license. It's MIT, oh, so it's MIT licensed. So you can do whatever you want, but don't sue me if it goes wrong. Like I said, it's science, and science is kind of weird sometimes. You gotta test stuff out.
So what I'm gonna do is at the bottom here, I am going to add a console.readkey. Did it finish? Nope. Okay, so I'll fix this little curly brace
that was too many of it. I'll do a console.readkey. Oops, I keep, your shifts are not as big as ours, sorry. Read key, and then I will, oops, I will go up like that.
And then I need to add some control dots, some actual, so control dot here. Control dot, and I will, uh-oh. Did it actually not add it yet?
Right click and make sure it added the NuGet package. It's still installing. Yeah, this is a horrible demo fail. I'm so sorry. Did you work on your laptop? Yeah. Change the camera. Wait, what?
We have had like some bad demo fails. And now my machine is angry at me.
What's that? Oh, netman.io front slash nuML front slash example.zip. Oh, are you saying the Linux box is gonna work before us? This is great. Hold on, let me go see.
You get it working yet? That's still good. A .net, yeah. Okay, so a dot, yeah, so it'd be .net restore.
Yeah. Okay, so I'm gonna try to new restore and see if this works. No, it's gonna be .net, that's the one. Yeah, I can't get .net to run. Oh, geez. All right, so what I'm gonna do then is because Ubuntu 14.04,
and the reason why is because they changed the library that we depend on, so that's the reason why. Okay, yeah, that's a problem with the wrong version of that, one second.
All right, so he's gonna put the camera here, and I know this is totally lame, and I feel bad. It's not lame at all, this is amazing. Yeah. All right, is it? All right, so again, I'm gonna show you this real quick,
and then that's probably gonna be the end because I think I'm almost out of time, which is kind of lame. I was gonna show you how to build a new iGenerator, a new iModel, but the idea is if you go to newml.net, you should have a really good download. It should be able to work, but they could not grab my computer, and that's kind of what screwed me up, so let me go. Seamless. Yeah, there you go.
Oh, are you seeing it? Oh, my goodness, that's actually really cool. Your font's big enough, we should be fine. Okay, okay, yes, I can absolutely, I can do whatever you tell me to, man. Boom. All right, here we go, here we go. Oh, this is interesting. Can you see it?
No. Back it up, back it up a little bit. There you go, okay. So hopefully you can see this. I'll go to the projects here, and I'll go, what I'll do is I'll, let's see, cd example, I don't have one, so let me make one. So mkdir, example, cd example,
and then I'll netman example to download my stuff. There it is, and then I'm gonna say .net restore. This fails. I know, and then this is not gonna fail, I've done it before. Can I just show you something? Yeah. Oh, look at this. Give me your thing.
Oh, it did work! Yes. I ran it with mono on DNX. Oh, and it worked. It worked, so yes. Let's do that. Linux wins. Oh, Linux wins. All right. So there it is.
Oh. So there you go, there it is in code. PS code on Linux. There's all your code. I don't know why you're getting the red underscores, but when you pop down my console window, because I've got a proper thing here. Sure, sorry, I clicked WebStorm.
You just launched WebStorm. Sorry. We probably don't want. No, we don't. So, stop it. Linux loses, man. I'm just saying. It's because you're in the way. Oh, nice. What do you mean it's your tool?
OK. Where do you tab? What I did to get this working was I used Yeoman, YoASPnet, created a new console application with that, set it to use mono, added your numeral reference to, so if you go Control-B.
Where's the? What's just happened there? I'm just looking for the. There we go, right. So, project.json. I basically put numeral in as a dependency. Got it. It's running on the mono runtime. There's the run command. There's your program.cs. There's your beta.cs. Where's the console?
Sorry, and the console, Control-F12. And we can do plus, plus like that. And then we just do DNX run, and there it goes. And you can scroll up and down just using. There you go. Finally.
So this works on Linux, everybody, incidentally. I just want to let you know. So here you can see it. Thanks so much, Mark, for saving my bacon. I owe you a drink. So there's step one. You don't really see the descriptor. Although, you know what? It probably, let me go back to, how do you just go? Control-F12.
So let's go here to this. And let me actually print out. Let me print out the descriptor. I probably shouldn't change anything, but I mean, what's going to happen, right? It might not work. That's a funny ha-ha, descriptor. OK, so I will go like that. So now we can print it out, Control-S, and then
Control-F12. And then I can do a DNX run again. And what you're going to do, what you're going to see is you're actually going to see the actual, the way the descriptor looks. Well, maybe it didn't write it out. Too far? There it is. There it is.
So you see for the tennis data set, you can see it has outlook, temperature, humidity, and windy, and then play. That's the thing we're learning, where to start. Those numbers are for bookkeeping. An example might be, you might have a feature. For example, what do you do if one of your features is a date, time? So what new ML does is it lets you decide what portions
of the date to expand into. Right? And so if you say, I want the month and the hour of the day, then what it will do is it will fill that matrix up instead of with one column for that feature with two. Does that make sense? And once it has two, then it can do the learning and then it can project back when it's trying to make the decision.
Another one is, what do you do, for example, when you have a string? Say you have feed data in there. Well, what it does is it will do a string property, and that string property will automatically do what is called bag of words. What it will do is it will go through all of your text, break it up into words, and then create those as features.
Is that the best thing to do? Maybe. Not if it's German. Right? Because German's funny. German, they like to make words out of smashing words together. No, they don't. They don't like things at all. So this might not work in German. So maybe you want to break it up by character. Maybe you want to break it up by something else, and that's what it will do for you.
So that's what that is. The next thing is, remember, here, oh, Control F12, sorry. I'll go back to this. The next thing that's cool is you saw this little, it spit out this data right here, and let me go back to Control F12. You can see that that's what it printed out.
The cool thing also, though, is I love Python when it comes to this, and so if you look at this right here in particular, notice that I'm printing out the transpose of that vector, which makes the matrix one column. For those that don't remember. Next, oh, I don't know what that did, but I will just hit X. Okay. So the next thing is to generate the model,
we have this particular model, the decision tree generator that's going to make this generator, and then we're going to make this model out of this tennis data set. We probably don't need that there, and then the descriptor and the thing that we have, and then it's going to write out the model, which you can see here, Control F12. Looks like this. Why did I use decision tree?
Well, it's because it's the only model that I overwrited the toString method. That was kind of funny. Thank you for that. And then the prediction step is false.
The next one you can see here is the actual one that it runs 100 times, so let me go Control F12, and then let me go to testing the accuracy. You can see that this one's a little bit different. You can see that this is the learner, and then we train on 80%,
run it 100 times with this generator, and then we learn this model, this is the accuracy that we get. All right, any questions about that? Okay, so here is the thing that I was going to do, but I'm kind of out of time because my technology fails. All you have to do to make a new predictor
is to implement iModel, I'm sorry, iGenerator with an iModel. But the thing about it is, is that the iGenerator and the iModel have a lot of superfluous things, so there is a base class called Model and Generator
that if you implement, if you inherit from, it will require you to override only two methods, one for each, right? The first one, if I remember right, is myGenerator.cs,
so I'm going to say public class myGenerator, inherits from generator, and then boom, boom, and then this should, first of all,
I should probably type this right, and then this should have a little hourglass that sort of tells me that I need to use this thingy, and then it's going to say, okay, well, let me go even better, let me just, since I'm already here and we're already friends, I'm going to say iGenerator, I'm going to add this here, I'm going to using this,
and then I'm going to implement this interface, and you're going to see there's a bunch of things in here, the one that's most important for this is this one, so I'm going to control C this, control Z, and I'm going to change this to the base generator here,
and then I am going to this, this, this, very good, use system, very good, this is good, this is good.
Yeah, it does, it's lying, I just implemented it. Yeah, it's, oh, okay, if you want to, so, oh, of course, oh, very good, thank you, thank you.
Oh, you got to work it on Windows too, okay, okay, okay, it doesn't matter. So here's the, if you want to make a generator, you do that, and if you want to make a model, you just say public class, my,
my model, and that implements I model, and then boom, boom, and then I can get the little hourglass, yes, I know, thank you, thank you, I am going to implement the interface. You can see that it has a lot of methods in there as well, oh, no touch screen. The only one that actually matters is this one, predict.
So I'll control X, control Z, control Z, and then I'll change this to model, and then I will control V, and then I will do a double predict, and control S, and that should work, what's the reason
why it doesn't like this? Yeah, it does, so it's lying to me. Okay, so once you have those two that you've implemented, you can literally swap out the, let me just implement, okay? So I'm gonna just say this, I am going to say
var M equals new my model, right? M is gonna use the descriptor that was passed in, so this descriptor equals the descriptor that was passed in that the generator always has, and then we're gonna do some magic, magic,
and then more, and then we're gonna return M. And then for prediction, what we're always gonna do is we are going to, we are just going to always return minus one, we're always gonna guess false.
You see that? And now what you can do is you can literally go back and sort of replace all the stuff from before, right? But this time you have to use a regular declaration, or a weak declaration, because instead of saying you are gonna do it as a type int,
you can just say as, and then you pass in the new property type that you have, or the new model that you have, and it'll just work. Okay, so this is a new iModel and a new iDescriptor, so let me just go in and see if we can replace it. So instead of using this decision tree generator, I am gonna use a my, oops, my, oh jeez,
my generator, right? And then this is gonna generate a generator, and notice that down here it's gonna get mad, but we're just gonna ignore this part here.
No, actually I can just delete this line and it all should just work. Yeah, do you see what I did there? I just swapped out generators, and because everything was implicitly typed with var, it should all just work. So control F12, let's see how well this,
oh, very good, and then dnx run, and then, oh jeez, no, I can delete the lock file.
So rm project.lock.json, and then dnu restore, and then dnx run, maybe that'll work. No, it had an error.
Oh, yep, I know where it is, yeah, I know what it is. I know what it is, I know how to fix it. Yeah, I know how to fix it. The problem is I am not using newml.
Very good. Well, in essence, you get the hint there. It should. And it's also not name-spaced either, so that's the other problem.
Yeah, somehow, it's managed to refuse to do the tenures. So it's borked. So in essence, that's how you do it. So you make a new model,
you make a new generator. You can also create new properties to sort out how to expand your data out into new particular values, et cetera, and so on. I'm going to finish there because I feel like I've already had enough fails for a, what is this, Wednesday afternoon? Any questions? So I want you to go and use it. Go to newml.net, go to Getting Started, go to the first page that you
see. It will tell you, and I promise, it will not be this difficult. It shouldn't be. On a Mac, I only encountered like one problem, and it was pretty sorted out. And then on Windows, it should just work. But did you get it to work? Yeah, I figured.
Yeah, it worked briefly. Thank you so much for being patient with me. At least we got most of it to work. And hopefully, you like the library. If you have any questions or you want to see it working on my laptop, I'm happy to show you that as well. I promise, it works. They couldn't get my screen. Any questions? Yes, sir. Yeah, that's something that Chris
has been adding. So there is this thing called a feature. I don't remember what he called it, but you can do that. We'll have to see about documenting that because I don't know how he did it. But yeah. Any other questions? Feel free. Yes. Yeah,
that's the other thing, right? So I'm going to open a browser. Is that OK? You don't have like a default, bad default link. OK. So newml.net. I'm going to, what is, what?
OK. If you go to, what was your question? Yeah, not yet. But there is an interface for that. So let me go to the API reference. And here is the, so for example, this is
probably the one you're interested in. Let me go to View Source. You can see that this is where all my linear algebra stuff is. And yeah, so if you're a mathematician and you're looking at this stuff and you're like, set doesn't really do a very good
job of optimizing symmetric matrices, you're right. Or set doesn't really do a good job of optimizing sparse matrices, you're probably right. But I do want to be able to add into the pipeline the way to move out of it. The problem is I tried using mat.net, but I just, I didn't like the way they did. There's certain things that
I do, like for example, in my indexing, you can actually pass funcs in there to do setters, which makes it a lot easier for me to do certain things, right? And there's also some interesting ways that I do slicing, right? You can pass an in removal of int into a slice and it will return just those, that slice of
stuff out. And that actually really helped me with certain kinds of models. So the answer is yes, I want to do it, but no, it's all in there, right there. And there's a lot of stuff in there. Anything that I needed for, anything that I needed? No. Anything that I needed for doing machine learning? It's
probably in there. Like for example, yeah, there's all sorts of stuff in there. Mean, max, like covariance I needed just because I was working on Gaussian mixture models. Good question. Any other questions? Yes. So he
added a multi class, Chris added a multi class classifier thingy. Let me see what he called it. If you go to this and then you go to supervised, he
added this thing for classification called a class, an I classifier. And then if you look at the actual implementation of the class, multi class classifier, you can see that he actually does a prediction on the label,
right? And you can see that he does, like for example, here's all the labels that it returns. No, in the model you'll have inside, because he's inheriting from learning model, in the learning model you'll have some information about that. Good question. Any other questions? Don't be bashful.
I mean, I already screwed up the demo, right? It's all good now. So I started this five years ago, and people have used it to varying success. One of them used it in a bank to detect anomalous logins.
It seemed to work pretty well. He hasn't called me since it worked, so it must work. You know what I'm saying, if they don't call you, it's like, it must work, right? You ever had like a software you built and you forgot, and they call you like ten years later, and you're like, oh, yeah, it's a battleship. He's like, yeah, all of them. Good for
you. I'm not quite to his level. Any more questions? Thanks so much for your patience, and we will see you next time. My name is Seth. If you go to at sethwars, you can reach me at any time. Thanks so much.